/ Hex Artifact Content
Login

Artifact 3db249dfcef40357a295bc481af99cfcadc896d4eef259992681534db909e335:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e  pareSkip(pTerm->
1ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64 78       pScan->pIdx
1b10: 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20  Expr,iCur)==0). 
1b20: 20 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61          && (pSca
1b30: 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20  n->iEquiv<=1 || 
1b40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b50: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1b60: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
1b70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b80: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
1ba0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
1bb0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
1bc0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
1bd0: 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20  an->aiCur).     
1be0: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73        && (pX = s
1bf0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c00: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
1c10: 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70  pr->pRight))->op
1c20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1c30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c40: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1c50: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c60: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
1c70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1c80: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1c90: 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69  >aiCur[j]==pX->i
1ca0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
1cb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
1cc0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e  iColumn[j]==pX->
1cd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
1d30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72      pScan->aiCur
1d50: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
1d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d70: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1d80: 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  j] = pX->iColumn
1d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1da0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b  pScan->nEquiv++;
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
1df0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e10: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
1e20: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
1e30: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
1e40: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
1e50: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
1e60: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
1e70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e80: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
1ea0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1eb0: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
1ec0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
1ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
1ef0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
1f20: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
1f30: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1f80: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
1f90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1fc0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
2000: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2020: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
2030: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2040: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2050: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2070: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
2080: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20d0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
20e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20f0: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
2100: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
2110: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
2120: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
2130: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
2150: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72  le==pScan->aiCur
2160: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
2170: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
2180: 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e  =pScan->aiColumn
2190: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
21a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
21e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2200: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2210: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  pWC = pWC;.     
2220: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
2230: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
2240: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
2250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2270: 20 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e       pWC = pWC->
2280: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
2290: 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
22a0: 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pWC!=0 );.    i
22b0: 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  f( pScan->iEquiv
22c0: 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  >=pScan->nEquiv 
22d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 57 43  ) break;.    pWC
22e0: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
22f0: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
2300: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b    pScan->iEquiv+
2310: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
2330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
2340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
2350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
2380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
2390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
23a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
23b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
23c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
23e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
23f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
2430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
2440: 2e 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d  .   Or if pIdx!=
2450: 30 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75  0 then X is colu
2460: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e  mn iColumn of in
2470: 64 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a  dex pIdx.  pIdx.
2480: 2a 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  ** must be one o
2490: 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66  f the indexes of
24a0: 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a   table iCur..**.
24b0: 2a 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  ** The <op> must
24c0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
24d0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
24e0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
24f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
2500: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
2510: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2520: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
2530: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
2540: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
2550: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
2560: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
2570: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
2580: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
2590: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
25a0: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
25b0: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
25c0: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
25d0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
25e0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
25f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2600: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
2610: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
2620: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
2630: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
2640: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
2650: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
2660: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
2670: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
2680: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
2690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
26a0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
26b0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
26c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
26d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
26e0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26f0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
2700: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2720: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
2730: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2740: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2750: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
2760: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
2770: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
2780: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
2790: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
27a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
27c0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
27d0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
27e0: 20 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e   */.){.  pScan->
27f0: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
2800: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
2810: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78  C;.  pScan->pIdx
2820: 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61  Expr = 0;.  pSca
2830: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
2840: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2850: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64  e = 0;.  if( pId
2860: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  x ){.    int j =
2870: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
2880: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
2890: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28a0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45  f( iColumn==XN_E
28b0: 58 50 52 20 29 7b 0a 20 20 20 20 20 20 70 53 63  XPR ){.      pSc
28c0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 70  an->pIdxExpr = p
28d0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
28e0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
28f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2900: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2910: 5b 6a 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [j];.    }else i
2920: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
2930: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2940: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
2950: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
2960: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
2970: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  mn>=0 ){.      p
2980: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
2990: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
29a0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
29b0: 69 74 79 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ity;.      pScan
29c0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
29d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
29e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29f0: 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50   iColumn==XN_EXP
2a00: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
2a10: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2a20: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2a30: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2a40: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2a50: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
2a60: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
2a70: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
2a80: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
2a90: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
2aa0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
2ab0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2ac0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2ad0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2ae0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2af0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2b00: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b10: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2b20: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2b30: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2b40: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72  of table iCur or
2b50: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a   of index pIdx.*
2b60: 2a 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64  * if pIdx!=0 and
2b70: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2b80: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2b90: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2ba0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20  ed by.** the op 
2bb0: 70 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75  parameter.  Retu
2bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2bd0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
2be0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21  ..**.** If pIdx!
2c00: 3d 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  =0 then it must 
2c10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
2c20: 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69  dexes of table i
2c30: 43 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68  Cur.  .** Search
2c40: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2c50: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2c60: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2c70: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2c80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2ca0: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2cb0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
2cc0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
2cd0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
2ce0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
2cf0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d00: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
2d10: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2d20: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2d30: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2d40: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2d50: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2d60: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2d70: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2d80: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2d90: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2da0: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2db0: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2dc0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2dd0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2de0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2df0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2e00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2e10: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2e20: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2e30: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2e40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2e50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2e60: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2e70: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2e80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2e90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2eb0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ec0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2ee0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2ef0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2f00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2f10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2f20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2f30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2f40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2f50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2f60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2f70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2f80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2f90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2fa0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2fb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2fc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2fd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2fe0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2ff0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
3000: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
3010: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
3020: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
3030: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
3040: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
3050: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
3060: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
3070: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
3080: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3090: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
30a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
30b0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
30c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
30d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
30e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
30f0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3100: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3110: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3120: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3130: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3140: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3150: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3160: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3190: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
31a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
31b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
31c0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
31d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
31e0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
31f0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
3200: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
3210: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
3220: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
3230: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
3240: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
3250: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
3260: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
3270: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
3280: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
3290: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
32a0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
32b0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
32c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
32d0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
32e0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
32f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3300: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
3310: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3320: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3330: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3340: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3350: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3360: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3370: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3380: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3390: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
33c0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
33d0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
33e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
3400: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
3410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3420: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3430: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3440: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3450: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3460: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3480: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3490: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
34a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
34b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
34d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
3500: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
3510: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3540: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3550: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3560: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3580: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3590: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
35a0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
35d0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
35e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
35f0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
3600: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
3610: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3640: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3650: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3660: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3670: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3680: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
36a0: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
36b0: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
36c0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
36d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
36e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
36f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3700: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
3710: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
3720: 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
3730: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
3740: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
3750: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3760: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
3770: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3780: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
3790: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
37a0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
37b0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  f index pIdx is 
37c0: 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74  NOT NULL.*/.stat
37d0: 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75  ic int indexColu
37e0: 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20  mnNotNull(Index 
37f0: 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29  *pIdx, int iCol)
3800: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
3810: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
3820: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
3830: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
3840: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d  nColumn );.  j =
3850: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
3860: 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d  iCol];.  if( j>=
3870: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3880: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3890: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20  ol[j].notNull;. 
38a0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d   }else if( j==(-
38b0: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
38c0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
38d0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29   assert( j==(-2)
38e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
38f0: 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20  ;  /* Assume an 
3900: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
3910: 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79 69  on can always yi
3920: 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  eld a NULL */.. 
3930: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3940: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
3950: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
3960: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
3970: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
3980: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
3990: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
39a0: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
39b0: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
39c0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
39d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
39e0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
39f0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
3a00: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
3a10: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
3a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3a30: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
3a40: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
3a50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3a60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3a70: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
3a80: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
3a90: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
3aa0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
3ab0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3ac0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
3ad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
3ae0: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
3af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
3b00: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
3b10: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
3b20: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
3b30: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
3b40: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
3b70: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
3b80: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
3b90: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
3ba0: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
3bb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
3bc0: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
3bd0: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
3be0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
3bf0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
3c00: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
3c10: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
3c20: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
3c30: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
3c40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
3c50: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
3c60: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
3c70: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3c80: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
3c90: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
3ca0: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
3cb0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
3cc0: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
3cd0: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
3ce0: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
3cf0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
3d00: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
3d10: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
3d20: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
3d30: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
3d40: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
3d50: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
3d60: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
3d70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3d80: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
3d90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3da0: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
3db0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3dc0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3dd0: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
3de0: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
3df0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
3e00: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3e10: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
3e20: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
3e30: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
3e40: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
3e50: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
3e60: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
3e70: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
3e80: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
3e90: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
3ea0: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
3eb0: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
3ec0: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
3ed0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
3ee0: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
3ef0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
3f00: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
3f10: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
3f20: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
3f30: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
3f40: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
3f50: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
3f60: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
3f70: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
3f80: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
3f90: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
3fa0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
3fb0: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
3fc0: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
3fd0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
3fe0: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
3ff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
4000: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
4010: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
4020: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
4030: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
4040: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
4050: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
4060: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
4070: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
4080: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
4090: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
40a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
40b0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
40c0: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
40d0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
40e0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
40f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
4100: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4110: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
4120: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
4130: 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69 74   iBase, i, ~(Bit
4140: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
4150: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
4160: 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  if( findIndexCol
4170: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
4180: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
4190: 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   i)<0 ) break;. 
41a0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65 78         if( index
41b0: 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49  ColumnNotNull(pI
41c0: 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65 61  dx, i)==0 ) brea
41d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
41e0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
41f0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
4200: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
4210: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
4220: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4230: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
4240: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
4250: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4260: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4270: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
4280: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
4290: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
42a0: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
42b0: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
42c0: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
42d0: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
42e0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
42f0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
4300: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43  .** Convert OP_C
4310: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f  olumn opcodes to
4320: 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65 76   OP_Copy in prev
4330: 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
4340: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   code..**.** Thi
4350: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f  s routine runs o
4360: 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56 44  ver generated VD
4370: 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61 6e  BE code and tran
4380: 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e  slates OP_Column
4390: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f  .** opcodes into
43a0: 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74 68   OP_Copy when th
43b0: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
43c0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
43d0: 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e 73  -routine .** ins
43e0: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
43f0: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20  e lookup..**.** 
4400: 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77 69  If the bIncrRowi
4410: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
4420: 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f  , then any OP_Ro
4430: 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  wid instructions
4440: 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54   on.** cursor iT
4450: 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66  abCur are transf
4460: 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e 75  ormed into OP_Nu
4470: 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63 72  ll. Or, if bIncr
4480: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
4490: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68 20  o,.** then each 
44a0: 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61 6e  OP_Rowid is tran
44b0: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e 20  sformed into an 
44c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 69  instruction to i
44d0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
44e0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
44f0: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
4500: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4510: 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c  oid translateCol
4520: 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50 61 72  umnToCopy(.  Par
4530: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4540: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4550: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ext */.  int iSt
4560: 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  art,         /* 
4570: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 74  Translate from t
4580: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  his opcode to th
4590: 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  e end */.  int i
45a0: 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20 2f  TabCur,        /
45b0: 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52  * OP_Column/OP_R
45c0: 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73 20  owid references 
45d0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
45e0: 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65 72  .  int iRegister
45f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ,      /* The fi
4600: 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  rst column is in
4610: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4620: 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f 77  /.  int bIncrRow
4630: 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  id      /* If no
4640: 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f 72  n-zero, transfor
4650: 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f 50  m OP_rowid to OP
4660: 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29 7b  _AddImm(1) */.){
4670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64  rse->pVdbe;.  Vd
4690: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
46a0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
46b0: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
46c0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
46d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
46e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
46f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4710: 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69  ; iStart<iEnd; i
4720: 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Start++, pOp++){
4730: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  .    if( pOp->p1
4740: 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  !=iTabCur ) cont
4750: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
4760: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
4770: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f  lumn ){.      pO
4780: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
4790: 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  opy;.      pOp->
47a0: 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69  p1 = pOp->p2 + i
47b0: 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20  Register;.      
47c0: 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70  pOp->p2 = pOp->p
47d0: 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  3;.      pOp->p3
47e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
47f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
4800: 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
4810: 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69     if( bIncrRowi
4820: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
4830: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
4840: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
4850: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4860: 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f  the OP_Rowid. */
4870: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4880: 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d  code = OP_AddImm
4890: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48a0: 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  1 = pOp->p2;.   
48b0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31       pOp->p2 = 1
48c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
48d0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
48e0: 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20  de = OP_Null;.  
48f0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
4900: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  0;.        pOp->
4910: 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  p3 = 0;.      }.
4920: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4930: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
4940: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
4950: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
4960: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
4970: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
4980: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
4990: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
49a0: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
49b0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
49c0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
49d0: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
49e0: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
49f0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
4a00: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
4a10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
4a20: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
4a30: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
4a40: 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
4a50: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
4a60: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
4a70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4a80: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4a90: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4aa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4ab0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4ac0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4ae0: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
4af0: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
4b00: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
4b10: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
4b20: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
4b30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4b40: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
4b50: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4b60: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
4b70: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4b80: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
4b90: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4ba0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
4bb0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4bc0: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
4bd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
4be0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
4bf0: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
4c00: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
4c10: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
4c20: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
4c30: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
4c40: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
4c50: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
4c60: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
4c70: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
4c80: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4c90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4ca0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4cb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4cc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4cd0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ce0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4cf0: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
4d00: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
4d10: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
4d20: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
4d30: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
4d40: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
4d50: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4d60: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
4d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
4d80: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d90: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
4da0: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
4db0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4dc0: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
4dd0: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
4de0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4df0: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
4e00: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
4e10: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
4e20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e30: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
4e40: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
4e50: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
4e60: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e70: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52  tf("  estimatedR
4e80: 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e  ows=%lld\n", p->
4e90: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
4ea0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
4eb0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
4ec0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
4ed0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
4ee0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4ef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4f00: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
4f10: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4f20: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4f30: 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
4f40: 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
4f50: 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
4f60: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
4f70: 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
4f80: 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
4f90: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
4fa0: 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
4fb0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
4fc0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
4fd0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
4fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4ff0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
5000: 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
5010: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5020: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
5030: 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
5040: 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
5050: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
5060: 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
5070: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
5080: 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
5090: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
50a0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
50b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
50c0: 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
50d0: 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
50e0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
50f0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
5100: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65  |WO_IS))==0 ) re
5110: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
5120: 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
5130: 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20 20 20   & JT_LEFT) .   
5140: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5150: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
5160: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
5170: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70    && (pTerm->eOp
5180: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 29 0a  erator & WO_IS).
5190: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e    ){.    /* Cann
51a0: 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74 65 72  ot use an IS ter
51b0: 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45  m from the WHERE
51c0: 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20 69 6e   clause as an in
51d0: 64 65 78 20 64 72 69 76 65 72 20 66 6f 72 0a 20  dex driver for. 
51e0: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 6f 66     ** the RHS of
51f0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 53 75   a LEFT JOIN. Su
5200: 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20 6f 6e  ch a term can on
5210: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 69 74  ly be used if it
5220: 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20   is from.    ** 
5230: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
5240: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
5250: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54 65 72  .  }.  if( (pTer
5260: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
5270: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
5280: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5290: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
52a0: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
52b0: 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
52c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
52d0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
52e0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
52f0: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
5300: 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
5310: 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
5320: 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73  urn 0;.  testcas
5330: 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
5340: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
5350: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
5360: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
5370: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
5380: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
5390: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
53a0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
53b0: 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
53c0: 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
53d0: 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
53e0: 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
53f0: 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
5400: 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
5410: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
5420: 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
5430: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
5440: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5450: 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
5460: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
5470: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5480: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5490: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
54a0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
54b0: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
54c0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
54d0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
54e0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
54f0: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
5500: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
5510: 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
5520: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
5530: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
5540: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
5550: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
5560: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
5570: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
5580: 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
5590: 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
55a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
55b0: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
55c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
55d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
55e0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
55f0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
5600: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
5610: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
5620: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
5630: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
5640: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
5650: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
5660: 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
5670: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
5680: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
5690: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
56a0: 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
56b0: 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
56c0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
56e0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
56f0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
5700: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
5710: 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
5720: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
5730: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
5740: 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
5750: 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
5760: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
5770: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
5780: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
5790: 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
57c0: 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
57d0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
57e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
57f0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
5800: 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
5810: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
5840: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5860: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5870: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5880: 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
5890: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
58a0: 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
58b0: 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
58c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
58e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
58f0: 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
5900: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
5910: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
5920: 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62    /* The Loop ob
5930: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
5940: 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20  zNotUsed;       
5950: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
5960: 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20  pace on the end 
5970: 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74  of pIdx */.  Bit
5980: 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
5990: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
59a0: 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
59b0: 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
59c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
59d0: 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
59e0: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
59f0: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
5a00: 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
5a10: 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
5a20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
5a30: 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
5a40: 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70   issued */.  Exp
5a50: 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b  r *pPartial = 0;
5a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74           /* Part
5a70: 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73  ial Index Expres
5a80: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sion */.  int iC
5a90: 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20  ontinue = 0;    
5aa0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
5ab0: 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75  re to skip exclu
5ac0: 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74  ded rows */.  st
5ad0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
5ae0: 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
5af0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
5b00: 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  m being indexed 
5b10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 75  */.  int addrCou
5b20: 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nter = 0;       
5b30: 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65 72   /* Address wher
5b40: 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74 65  e integer counte
5b50: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
5b60: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
5b70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5b80: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
5b90: 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72 65  gisters where re
5ba0: 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c 65  cord is assemble
5bb0: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  d */..  /* Gener
5bc0: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
5bd0: 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
5be0: 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
5bf0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
5c00: 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
5c10: 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
5c20: 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
5c30: 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
5c40: 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
5c50: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
5c60: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
5c70: 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
5c80: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
5c90: 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
5ca0: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
5cb0: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5cc0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
5cd0: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5ce0: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
5cf0: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
5d00: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
5d10: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
5d20: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
5d30: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
5d40: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
5d50: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
5d60: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
5d70: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
5d80: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
5d90: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
5da0: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
5db0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
5dc0: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
5dd0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
5de0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5df0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
5e00: 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72  omJoin)    /* pr
5e10: 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  ereq always non-
5e20: 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20  zero */.        
5e30: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
5e40: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63  tJoinTable!=pSrc
5e50: 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20  ->iCursor   /*  
5e60: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
5e70: 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  and   */.       
5e80: 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72    || pLoop->prer
5e90: 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  eq!=0 );        
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5eb0: 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46    table of a LEF
5ec0: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66  T JOIN */.    if
5ed0: 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d  ( pLoop->prereq=
5ee0: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
5ef0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
5f00: 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20  M_VIRTUAL)==0.  
5f10: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
5f20: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5f30: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
5f40: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
5f50: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45  TableConstant(pE
5f60: 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  xpr, pSrc->iCurs
5f70: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  or) ){.      pPa
5f80: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45  rtial = sqlite3E
5f90: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
5fa0: 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20  b, pPartial,.   
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5fd0: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
5fe0: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
5ff0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
6000: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
6010: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
6020: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
6030: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
6040: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6050: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
6060: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
6070: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
6080: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
6090: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
60a0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
60b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
60c0: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
60d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
60e0: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
60f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
6100: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
6110: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
6120: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
6130: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
6140: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
6150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
6160: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
6170: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
6180: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
6190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61a0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
61b0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
61c0: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
61d0: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
61e0: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
61f0: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
6200: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
6210: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
6220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6230: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
6240: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
6250: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
6260: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
6270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6280: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
6290: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
62a0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
62b0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
62c0: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
62d0: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
62e0: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
62f0: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
6300: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
6320: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
6330: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
6340: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
6350: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
6360: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
6370: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
6380: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
6390: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
63a0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
63b0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
63c0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
63d0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
63e0: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
63f0: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
6400: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6410: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
6420: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
6430: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
6440: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
6450: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6460: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
6470: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
6480: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
6490: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
64a0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
64b0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
64c0: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
64d0: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
64e0: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
64f0: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
6500: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
6510: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
6520: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
6530: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
6540: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
6550: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
6560: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
6570: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
6580: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6590: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
65a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
65b0: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
65c0: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
65d0: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
65e0: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
65f0: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
6600: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
6610: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
6620: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
6630: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
6640: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
6650: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
6660: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
6670: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
6680: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
6690: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
66a0: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
66b0: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
66c0: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
66d0: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
66e0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
66f0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
6700: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
6710: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
6720: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
6730: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
6740: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
6750: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
6760: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
6770: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
6780: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
6790: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
67a0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
67b0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
67c0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
67d0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
67e0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
67f0: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6800: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6810: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6820: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6830: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6840: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
6850: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
6860: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
6870: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
6880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
6890: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
68a0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
68b0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
68c0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
68d0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
68e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
68f0: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
6900: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
6910: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
6920: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
6930: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
6940: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
6950: 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20  ll[n] = pColl ? 
6960: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73  pColl->zName : s
6970: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
6980: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
6990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
69a0: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
69b0: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
69c0: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
69d0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
69e0: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
69f0: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
6a00: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
6a10: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
6a20: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
6a30: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
6a40: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
6a50: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
6a60: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
6a70: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
6a80: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
6a90: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
6aa0: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6ab0: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6ac0: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
6ad0: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
6ae0: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
6af0: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
6b00: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
6b10: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6b20: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6b30: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
6b40: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
6b50: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
6b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
6b70: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
6b80: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
6b90: 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[n] = XN_ROW
6ba0: 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  ID;.  pIdx->azCo
6bb0: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6bc0: 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20  trBINARY;..  /* 
6bd0: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6be0: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6bf0: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6c00: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6c10: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6c20: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6c30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6c40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6c50: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
6c60: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
6c70: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6c80: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6c90: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6ca0: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
6cb0: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
6cc0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6cd0: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6ce0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6cf0: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6d00: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6d10: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6d20: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6d30: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
6d40: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
6d50: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
6d60: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
6d70: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
6d80: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
6d90: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
6da0: 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d     addrCounter =
6db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6dc0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6dd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6de0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6df0: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
6e00: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
6e10: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
6e20: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64  illSub);.    add
6e30: 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56  rTop =  sqlite3V
6e40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6e50: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
6e60: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
6e70: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
6e80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
6e90: 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c   row of \"%s\"",
6ea0: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
6eb0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  >zName));.  }els
6ec0: 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  e{.    addrTop =
6ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ee0: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
6ef0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6f00: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6f10: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
6f20: 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43  artial ){.    iC
6f30: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6f40: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6f60: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6f70: 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e  , pPartial, iCon
6f80: 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tinue, SQLITE_JU
6f90: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
6fa0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
6fb0: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
6fc0: 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f  X;.  }.  regReco
6fd0: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
6fe0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6ff0: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
7000: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
7010: 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73  Key(.      pPars
7020: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
7030: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
7040: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a  ord, 0, 0, 0, 0.
7050: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
7060: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7070: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
7080: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
7090: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
70a0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
70b0: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
70c0: 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
70d0: 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
70e0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
70f0: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
7100: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
7110: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
7120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7130: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
7140: 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73  rCounter, regBas
7150: 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+n);.    testca
7160: 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  se( pParse->db->
7170: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7180: 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
7190: 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65  umnToCopy(pParse
71a0: 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65  , addrTop, pLeve
71b0: 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20  l->iTabCur,.    
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
71e0: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
71f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
7200: 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  to(v, addrTop);.
7210: 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67      pTabItem->fg
7220: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
7230: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
7240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7250: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c  2(v, OP_Next, pL
7260: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61  evel->iTabCur, a
7270: 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43  ddrTop+1); VdbeC
7280: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
7290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
72a0: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
72b0: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
72c0: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
72d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
72e0: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
72f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7300: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
7310: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ord);.  sqlite3E
7320: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
7330: 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  se);.  .  /* Jum
7340: 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
7350: 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
7360: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
7370: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
7380: 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a  (v, addrInit);..
7390: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
73a0: 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33  reate:.  sqlite3
73b0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
73c0: 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29  e->db, pPartial)
73d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
73e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
73f0: 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69  TIC_INDEX */..#i
7400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7410: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
7420: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
7430: 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71  d populate an sq
7440: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7450: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
7460: 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
7470: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
7480: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
7490: 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65  ally release the
74a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79   structure.** by
74b0: 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69   passing the poi
74c0: 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
74d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
74e0: 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
74f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
7500: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
7510: 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
7520: 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  o(.  Parse *pPar
7530: 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73  se,.  WhereClaus
7540: 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d 61 73  e *pWC,.  Bitmas
7550: 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20  k mUnusable,    
7560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
7570: 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20 74  ore terms with t
7580: 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a  hese prereqs */.
7590: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
75a0: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45  _item *pSrc,.  E
75b0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
75c0: 79 2c 0a 20 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d  y,.  u16 *pmNoOm
75d0: 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
75e0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
75f0: 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20 6f 6d 69  terms not to omi
7600: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  t */.){.  int i,
7610: 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
7620: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7630: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7640: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
7650: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7660: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
7670: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
7680: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7690: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
76a0: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
76b0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
76c0: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
76d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
76e0: 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
76f0: 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20    u16 mNoOmit = 
7700: 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  0;..  /* Count t
7710: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
7720: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
7730: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
7740: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
7750: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
7760: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
7770: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
7780: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
7790: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
77a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
77b0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
77c0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
77d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
77e0: 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
77f0: 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65  ight & mUnusable
7800: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7810: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
7820: 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70  OfTwo(pTerm->eOp
7830: 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55  erator & ~WO_EQU
7840: 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  IV) );.    testc
7850: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7860: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
7870: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7880: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7890: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
78a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
78b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
78c0: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
78d0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
78e0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
78f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
7900: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7910: 7e 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20  ~(WO_EQUIV))==0 
7920: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7930: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
7940: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
7950: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7960: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75  assert( pTerm->u
7970: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31  .leftColumn>=(-1
7980: 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  ) );.    nTerm++
7990: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
79a0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
79b0: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
79c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
79d0: 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
79e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
79f0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
7a00: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
7a10: 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
7a20: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a30: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
7a40: 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
7a50: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
7a60: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
7a70: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
7a80: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
7a90: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
7aa0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7ab0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
7ac0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
7ad0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
7ae0: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
7af0: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
7b00: 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
7b10: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
7b20: 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
7b30: 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
7b40: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7b50: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
7b60: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7b70: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
7b80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7b90: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
7ba0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
7bb0: 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
7be0: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
7bf0: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
7c20: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
7c30: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
7c40: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
7c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7c60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
7c70: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
7c80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7c90: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7ca0: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
7cb0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
7cc0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7cd0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
7ce0: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
7cf0: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
7d00: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
7d10: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
7d20: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
7d30: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
7d40: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
7d50: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
7d60: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
7d70: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
7d80: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
7d90: 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
7da0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7db0: 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
7dc0: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
7dd0: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
7de0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7df0: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
7e00: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
7e10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7e20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7e30: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
7e40: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
7e50: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
7e60: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
7e70: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
7e80: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
7e90: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
7ea0: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7eb0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7ec0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
7ed0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
7ee0: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
7ef0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7f00: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
7f10: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
7f20: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
7f30: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7f40: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7f50: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
7f60: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
7f70: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
7fc0: 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
7fd0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
7fe0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7ff0: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
8000: 20 20 20 75 31 36 20 6f 70 3b 0a 20 20 20 20 69     u16 op;.    i
8010: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
8020: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
8030: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
8040: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
8050: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
8060: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
8070: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
8080: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
8090: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
80a0: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
80b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
80c0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
80d0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
80e0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
80f0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
8100: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8110: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8120: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
8130: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8140: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8150: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
8160: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8170: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51 55  rator & ~(WO_EQU
8180: 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IV))==0 ) contin
8190: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
81a0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
81b0: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
81c0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
81d0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
81e0: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
81f0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f   pIdxCons[j].iCo
8200: 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  lumn = pTerm->u.
8210: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
8220: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72  pIdxCons[j].iTer
8230: 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20  mOffset = i;.   
8240: 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70   op = pTerm->eOp
8250: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b  erator & WO_ALL;
8260: 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f  .    if( op==WO_
8270: 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b  IN ) op = WO_EQ;
8280: 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f  .    if( op==WO_
8290: 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 70  MATCH ){.      p
82a0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
82b0: 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b  pTerm->eMatchOp;
82c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
82d0: 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  p & (WO_ISNULL|W
82e0: 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69  O_IS) ){.      i
82f0: 66 28 20 6f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  f( op==WO_ISNULL
8300: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
8310: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c  Cons[j].op = SQL
8320: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8330: 41 49 4e 54 5f 49 53 4e 55 4c 4c 3b 0a 20 20 20  AINT_ISNULL;.   
8340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8350: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
8360: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   = SQLITE_INDEX_
8370: 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3b 0a 20  CONSTRAINT_IS;. 
8380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8390: 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  {.      pIdxCons
83a0: 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 6f 70 3b  [j].op = (u8)op;
83b0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69  .      /* The di
83c0: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
83d0: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
83e0: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
83f0: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
8400: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
8410: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
8420: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
8430: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
8440: 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66    The.      ** f
8450: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
8460: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
8470: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  t. */.      asse
8480: 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
8490: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
84a0: 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61  NT_EQ );.      a
84b0: 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
84c0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
84d0: 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
84e0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
84f0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8500: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
8510: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
8520: 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
8530: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
8540: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8550: 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
8560: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
8570: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
8580: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
8590: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
85a0: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
85b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
85c0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f  m->eOperator&(WO
85d0: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
85e0: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
85f0: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 0a  E|WO_MATCH) );..
8600: 20 20 20 20 20 20 69 66 28 20 6f 70 20 26 20 28        if( op & (
8610: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
8620: 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20 20 20  T|WO_GE).       
8630: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
8640: 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45  Vector(pTerm->pE
8650: 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20 20  xpr->pRight) .  
8660: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
8670: 66 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69  f( i<16 ) mNoOmi
8680: 74 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20  t |= (1 << i);. 
8690: 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57         if( op==W
86a0: 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e 73 5b  O_LT ) pIdxCons[
86b0: 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20  j].op = WO_LE;. 
86c0: 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57         if( op==W
86d0: 4f 5f 47 54 20 29 20 70 49 64 78 43 6f 6e 73 5b  O_GT ) pIdxCons[
86e0: 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20  j].op = WO_GE;. 
86f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8700: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
8710: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
8720: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8730: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
8740: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8750: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
8760: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
8770: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
8780: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
8790: 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
87a0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
87b0: 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69  .  }..  *pmNoOmi
87c0: 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72  t = mNoOmit;.  r
87d0: 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
87e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
87f0: 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
8800: 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
8810: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8820: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
8830: 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
8840: 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
8850: 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
8860: 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
8870: 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
8880: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
8890: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
88a0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
88b0: 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
88c0: 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
88d0: 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
88e0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
88f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
8900: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8910: 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
8920: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
8930: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
8940: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
8950: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
8960: 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
8970: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
8980: 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
8990: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
89a0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
89b0: 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
89c0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
89d0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
89e0: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
89f0: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
8a00: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
8a10: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
8a20: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
8a30: 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
8a40: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
8a50: 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
8a60: 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
8a70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8a80: 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
8a90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
8aa0: 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
8ab0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
8ac0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
8ad0: 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
8ae0: 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
8af0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
8b00: 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Vtab;.  int rc;.
8b10: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
8b20: 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
8b30: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
8b40: 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
8b50: 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
8b60: 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
8b70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8b80: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
8b90: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
8ba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
8bb0: 6d 46 61 75 6c 74 28 70 50 61 72 73 65 2d 3e 64  mFault(pParse->d
8bc0: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  b);.    }else if
8bd0: 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
8be0: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
8bf0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8c00: 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
8c10: 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
8c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8c30: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8c40: 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
8c50: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
8c60: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8c70: 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
8c80: 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
8c90: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 23 69  zErrMsg = 0;..#i
8ca0: 66 20 30 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  f 0.  /* This er
8cb0: 72 6f 72 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ror is now caugh
8cc0: 74 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  t by the caller.
8cd0: 0a 20 20 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  .  ** Search for
8ce0: 20 22 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c   "xBestIndex mal
8cf0: 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f 77 20  function" below 
8d00: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8d10: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
8d20: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
8d30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
8d40: 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
8d50: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
8d60: 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
8d70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8d80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8d90: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
8da0: 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
8db0: 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
8dc0: 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
8dd0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
8de0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
8df0: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
8e00: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
8e10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8e20: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
8e30: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
8e40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8e50: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
8e60: 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61  stimate the loca
8e70: 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63  tion of a partic
8e80: 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61  ular key among a
8e90: 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a  ll keys in an.**
8ea0: 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74   index.  Store t
8eb0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53  he results in aS
8ec0: 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  tat as follows:.
8ed0: 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30  **.**    aStat[0
8ee0: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
8ef0: 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20  er of rows less 
8f00: 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20  than pRec.**    
8f10: 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73  aStat[1]      Es
8f20: 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
8f30: 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a  s equal to pRec.
8f40: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
8f50: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61   index of the sa
8f60: 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65  mple that is the
8f70: 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   smallest sample
8f80: 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61   that.** is grea
8f90: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
8fa0: 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20  l to pRec. Note 
8fb0: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
8fc0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a  is not an index.
8fd0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d  ** into the aSam
8fe0: 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74  ple[] array - it
8ff0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74   is an index int
9000: 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20  o a virtual set 
9010: 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61  of samples.** ba
9020: 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
9030: 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d  nts of aSample[]
9040: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
9050: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63  of fields in rec
9060: 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a  ord .** pRec. .*
9070: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
9080: 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
9090: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
90a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
90b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
90c0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
90d0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
90e0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
90f0: 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
9100: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
9110: 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
9120: 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
9130: 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
9140: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
9150: 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
9160: 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
9170: 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
9180: 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
9190: 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91b0: 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
91c0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
91d0: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
91e0: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
91f0: 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
9200: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9210: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9220: 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
9230: 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
9240: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
9270: 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63  t sample >= pRec
9280: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c   */.  int iSampl
9290: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
92a0: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
92b0: 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
92c0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
92d0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20  c */.  int iMin 
92e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
92f0: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
9300: 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65  ample not yet te
9310: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  sted */.  int iT
9320: 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
9330: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61        /* Next sa
9340: 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  mple to test */.
9350: 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9370: 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   Result of compa
9380: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
9390: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
93c0: 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a  elds in pRec */.
93d0: 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
93e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
93f0: 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d   anLt[] + anEq[]
9400: 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70   of largest samp
9410: 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a  le pRec is > */.
9420: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9430: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
9440: 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
9450: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
9460: 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
9470: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9480: 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
9490: 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
94a0: 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e  eld>0 && pRec->n
94b0: 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61  Field<=pIdx->nSa
94c0: 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a  mpleCol );..  /*
94d0: 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   Do a binary sea
94e0: 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  rch to find the 
94f0: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65  first sample gre
9500: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
9510: 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e  al.  ** to pRec.
9520: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
9530: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  s a single field
9540: 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  , the set of sam
9550: 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20  ples to search. 
9560: 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68   ** is simply th
9570: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
9580: 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65  y. If the sample
9590: 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63  s in aSample[] c
95a0: 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a  ontain more.  **
95b0: 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73   than one fields
95c0: 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c  , all fields fol
95d0: 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74  lowing the first
95e0: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20   are ignored..  
95f0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20  **.  ** If pRec 
9600: 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64  contains N field
9610: 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f  s, where N is mo
9620: 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65  re than one, the
9630: 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  n as well as the
9640: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e  .  ** samples in
9650: 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e   aSample[] (trun
9660: 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64  cated to N field
9670: 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61  s), the search a
9680: 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  lso has to.  ** 
9690: 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65  consider prefixe
96a0: 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c  s of those sampl
96b0: 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  es. For example,
96c0: 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73   if the set of s
96d0: 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61  amples.  ** in a
96e0: 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a  Sample is:.  **.
96f0: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9700: 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20  [0] = (a, 5) .  
9710: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31  **     aSample[1
9720: 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a  ] = (a, 10) .  *
9730: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d  *     aSample[2]
9740: 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20   = (b, 5) .  ** 
9750: 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d      aSample[3] =
9760: 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
9770: 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d      aSample[4] =
9780: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
9790: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61   ** Then the sea
97a0: 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64  rch space should
97b0: 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20   ideally be the 
97c0: 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e  samples above an
97d0: 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71  d the .  ** uniq
97e0: 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c  ue prefixes [a],
97f0: 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75   [b] and [c]. Bu
9800: 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20  t since that is 
9810: 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65  hard to organize
9820: 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  , .  ** the code
9830: 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68   actually search
9840: 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a  es this set:.  *
9850: 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61  *.  **     0: (a
9860: 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28  ) .  **     1: (
9870: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
9880: 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  2: (a, 10) .  **
9890: 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20       3: (a, 10) 
98a0: 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29  .  **     4: (b)
98b0: 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62   .  **     5: (b
98c0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36  , 5) .  **     6
98d0: 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (c) .  **     
98e0: 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a  7: (c, 100) .  *
98f0: 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35  *     8: (c, 105
9900: 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63  ).  **     9: (c
9910: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
9920: 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65   For each sample
9930: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
9940: 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c  ] array, N sampl
9950: 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  es are present i
9960: 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63  n the.  ** effec
9970: 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61  tive sample arra
9980: 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c  y. In the above,
9990: 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31   samples 0 and 1
99a0: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20   are based on . 
99b0: 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   ** sample aSamp
99c0: 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32  le[0]. Samples 2
99d0: 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c   and 3 on aSampl
99e0: 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  e[1] etc..  **. 
99f0: 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c   ** Often, sampl
9a00: 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63  e i of each bloc
9a10: 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65  k of N effective
9a20: 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b   samples has (i+
9a30: 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20  1) fields..  ** 
9a40: 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d  Except, each sam
9a50: 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e  ple may be exten
9a60: 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ded to ensure th
9a70: 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72  at it is greater
9a80: 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71   than or.  ** eq
9a90: 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69  ual to the previ
9aa0: 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ous sample in th
9ab0: 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61  e array. For exa
9ac0: 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f  mple, in the abo
9ad0: 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65  ve, .  ** sample
9ae0: 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20   2 is the first 
9af0: 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63  sample of a bloc
9b00: 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20  k of N samples, 
9b10: 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a  so at first it .
9b20: 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61    ** appears tha
9b30: 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31  t it should be 1
9b40: 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20   field in size. 
9b50: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f  However, that wo
9b60: 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a  uld make it .  *
9b70: 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73  * smaller than s
9b80: 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20  ample 1, so the 
9b90: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f  binary search wo
9ba0: 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73  uld not work. As
9bb0: 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a   a result, .  **
9bc0: 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20   it is extended 
9bd0: 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54  to two fields. T
9be0: 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68  he duplicates th
9bf0: 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20  at this creates 
9c00: 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75  do not .  ** cau
9c10: 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
9c20: 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d  .  */.  nField =
9c30: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20   pRec->nField;. 
9c40: 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61   iCol = 0;.  iSa
9c50: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61  mple = pIdx->nSa
9c60: 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20  mple * nField;. 
9c70: 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61   do{.    int iSa
9c80: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
9c90: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9ca0: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20  in aSample[] of 
9cb0: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20  test sample */. 
9cc0: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
9cf0: 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d  elds in test sam
9d00: 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73  ple */..    iTes
9d10: 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c  t = (iMin+iSampl
9d20: 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20  e)/2;.    iSamp 
9d30: 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64  = iTest / nField
9d40: 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e  ;.    if( iSamp>
9d50: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
9d60: 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63  e proposed effec
9d70: 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61  tive sample is a
9d80: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
9d90: 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e aSample[iSamp]
9da0: 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69  ..      ** Speci
9db0: 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f  fically, the sho
9dc0: 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rtest prefix of 
9dd0: 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54  at least (1 + iT
9de0: 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20  est%nField) .   
9df0: 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61     ** fields tha
9e00: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9e10: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  n the previous e
9e20: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e  ffective sample.
9e30: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e    */.      for(n
9e40: 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64  =(iTest % nField
9e50: 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b  ) + 1; n<nField;
9e60: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   n++){.        i
9e70: 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  f( aSample[iSamp
9e80: 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61  -1].anLt[n-1]!=a
9e90: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9ea0: 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b  Lt[n-1] ) break;
9eb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9ec0: 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54  se{.      n = iT
9ed0: 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a  est + 1;.    }..
9ee0: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9ef0: 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20   = n;.    res = 
9f00: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f10: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9f20: 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70  [iSamp].n, aSamp
9f30: 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65  le[iSamp].p, pRe
9f40: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  c);.    if( res<
9f50: 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
9f60: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
9f70: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61  p].anLt[n-1] + a
9f80: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9f90: 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Eq[n-1];.      i
9fa0: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
9fb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
9fc0: 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20  ==0 && n<nField 
9fd0: 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
9fe0: 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
9ff0: 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anLt[n-1];.    
a000: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
a010: 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31  ;.      res = -1
a020: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a030: 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65     iSample = iTe
a040: 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d  st;.      iCol =
a050: 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77   n-1;.    }.  }w
a060: 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69  hile( res && iMi
a070: 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69  n<iSample );.  i
a080: 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69   = iSample / nFi
a090: 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  eld;..#ifdef SQL
a0a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
a0b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
a0c0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
a0d0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
a0e0: 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
a0f0: 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
a100: 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
a110: 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
a120: 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
a130: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
a140: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
a150: 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
a160: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
a170: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
a180: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
a190: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28  ){.      /* If (
a1a0: 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c  res==0) is true,
a1b0: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
a1c0: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70  be equal to samp
a1d0: 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61  le i. */.      a
a1e0: 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e  ssert( i<pIdx->n
a1f0: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20  Sample );.      
a200: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
a210: 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20  ield-1 );.      
a220: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
a230: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73  Field;.      ass
a240: 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56  ert( 0==sqlite3V
a250: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
a260: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
a270: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
a280: 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  c) .           |
a290: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
a2a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20  llocFailed .    
a2b0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
a2c0: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20        /* Unless 
a2d0: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
a2e0: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
a2f0: 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72  t pRec is larger
a300: 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61   than.      ** a
a310: 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
a320: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
a330: 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  y, pRec must be 
a340: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
a350: 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b  .      ** (iCol+
a360: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a370: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f  of sample i.  */
a380: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a390: 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  <=pIdx->nSample 
a3a0: 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20  && i>=0 );.     
a3b0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
a3c0: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73  iCol+1;.      as
a3d0: 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
a3e0: 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
a3f0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
a400: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a410: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
a420: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
a430: 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  >0.           ||
a440: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a450: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
a460: 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61      /* if i==0 a
a470: 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  nd iCol==0, then
a480: 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   record pRec is 
a490: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c  smaller than all
a4a0: 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a   samples.      *
a4b0: 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  * in the aSample
a4c0: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
a4d0: 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29  ise, if (iCol>0)
a4e0: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a   then pRec must.
a4f0: 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61        ** be grea
a500: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
a510: 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20  l to the (iCol) 
a520: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
a530: 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20  sample i..      
a540: 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65  ** If (i>0), the
a550: 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f  n pRec must also
a560: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
a570: 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20   sample (i-1).  
a580: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  */.      if( iCo
a590: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
a5a0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
a5b0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ol;.        asse
a5c0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
a5d0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
a5e0: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
a5f0: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d  le[i].p, pRec)<=
a600: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
a610: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
a620: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a630: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a640: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i>0 ){.        p
a650: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
a660: 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73  ield;.        as
a670: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
a680: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a690: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
a6a0: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
a6b0: 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
a6c0: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
a6d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a6e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a6f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
a700: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a710: 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d  G */..  if( res=
a720: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63  =0 ){.    /* Rec
a730: 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61  ord pRec is equa
a740: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f  l to sample i */
a750: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
a760: 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20  l==nField-1 );. 
a770: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
a780: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
a790: 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  ol];.    aStat[1
a7a0: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
a7b0: 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c  nEq[iCol];.  }el
a7c0: 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  se{.    /* At th
a7d0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69  is point, the (i
a7e0: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
a7f0: 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69  fix of aSample[i
a800: 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a  ] is the first .
a810: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68      ** sample th
a820: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
a830: 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20  an pRec. Or, if 
a840: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
a850: 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a   then pRec.    *
a860: 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
a870: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
a880: 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  the array. */.  
a890: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
a8a0: 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
a8b0: 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
a8c0: 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72   ){.      iUpper
a8d0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
a8e0: 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f  ToInt(pIdx->aiRo
a8f0: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
a900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
a910: 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  pper = aSample[i
a920: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
a930: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f    }..    if( iLo
a940: 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
a950: 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
a960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a970: 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
a980: 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
a990: 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
a9a0: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
a9b0: 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
a9c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
a9d0: 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
a9e0: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
a9f0: 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
aa00: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
aa10: 78 2d 3e 61 41 76 67 45 71 5b 6e 46 69 65 6c 64  x->aAvgEq[nField
aa20: 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  -1];.  }..  /* R
aa30: 65 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d  estore the pRec-
aa40: 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65  >nField value be
aa50: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
aa60: 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65   */.  pRec->nFie
aa70: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72  ld = nField;.  r
aa80: 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69  eturn i;.}.#endi
aa90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
aaa0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
aab0: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  4 */../*.** If i
aac0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70  t is not NULL, p
aad0: 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74  Term is a term t
aae0: 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
aaf0: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a  upper or lower.*
ab00: 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e  * bound on a ran
ab10: 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74  ge scan. Without
ab20: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65   considering pTe
ab30: 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  rm, it is estima
ab40: 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ted .** that the
ab50: 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
ab60: 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73   nNew rows. This
ab70: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
ab80: 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
ab90: 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
aba0: 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61  visited after ta
abb0: 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20  king pTerm into 
abc0: 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  account..**.** I
abd0: 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69  f the user expli
abe0: 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
abf0: 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  a likelihood() v
ac00: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65  alue for this te
ac10: 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  rm,.** then the 
ac20: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
ac30: 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d  the likelihood m
ac40: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
ac50: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e   number of.** in
ac60: 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77  put rows. Otherw
ac70: 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ise, this functi
ac80: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
ac90: 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  an "IS NOT NULL"
aca0: 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c   term.** has a l
acb0: 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35  ikelihood of 0.5
acc0: 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  0, and any other
acd0: 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f   term a likeliho
ace0: 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73  od of 0.25..*/.s
acf0: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
ad00: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68  reRangeAdjust(Wh
ad10: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
ad20: 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20  LogEst nNew){.  
ad30: 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e  LogEst nRet = nN
ad40: 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  ew;.  if( pTerm 
ad50: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
ad60: 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
ad70: 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20  {.      nRet += 
ad80: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
ad90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ada0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
adb0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
adc0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d   ){.      nRet -
add0: 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
ade0: 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
adf0: 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
ae00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ae10: 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  nRet;.}...#ifdef
ae20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ae30: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
ae40: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
ae50: 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69  ffinity for a si
ae60: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ngle column of a
ae70: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72  n index..*/.char
ae80: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
ae90: 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69  umnAffinity(sqli
aea0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
aeb0: 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  pIdx, int iCol){
aec0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
aed0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
aee0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66  >nColumn );.  if
aef0: 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  ( !pIdx->zColAff
af00: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
af10: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
af20: 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30  Str(db, pIdx)==0
af30: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
af40: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20  _AFF_BLOB;.  }. 
af50: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43   return pIdx->zC
af60: 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23  olAff[iCol];.}.#
af70: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
af80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
af90: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
afa0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
afb0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
afc0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
afd0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
afe0: 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
aff0: 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
b000: 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
b010: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
b020: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
b030: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
b040: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
b050: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
b060: 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
b070: 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
b080: 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
b090: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
b0a0: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
b0b0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
b0c0: 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
b0d0: 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
b0e0: 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
b0f0: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
b100: 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
b110: 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
b120: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
b130: 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
b140: 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
b150: 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
b160: 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
b170: 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
b180: 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
b190: 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
b1a0: 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
b1b0: 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
b1c0: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
b1d0: 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
b1e0: 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
b1f0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
b200: 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
b210: 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
b220: 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
b230: 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
b240: 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
b250: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
b260: 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
b270: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
b280: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
b290: 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
b2a0: 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
b2b0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
b2c0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
b2d0: 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
b2e0: 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
b2f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
b300: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
b310: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
b320: 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
b330: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
b340: 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
b350: 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
b360: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
b370: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
b380: 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
b390: 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
b3a0: 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
b3b0: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
b3c0: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
b3d0: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
b3e0: 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
b3f0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
b400: 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
b410: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
b420: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
b430: 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
b440: 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
b450: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
b460: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
b470: 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
b480: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b490: 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
b4a0: 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
b4b0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b4c0: 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
b4d0: 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
b4e0: 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
b4f0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b500: 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
b510: 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
b520: 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
b530: 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
b540: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
b550: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
b560: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
b570: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
b580: 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
b590: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b5a0: 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
b5b0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
b5c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b5d0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
b5e0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
b5f0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
b600: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
b610: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
b620: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
b630: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
b640: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
b650: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
b660: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
b670: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
b680: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
b690: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
b6a0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
b6b0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
b6c0: 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
b6d0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
b6e0: 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
b6f0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
b700: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
b710: 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
b720: 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
b730: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
b740: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
b750: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
b760: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
b770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b780: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b790: 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
b7a0: 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
b7b0: 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
b7c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b7d0: 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71  K;.  u8 aff = sq
b7e0: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
b7f0: 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20  Affinity(db, p, 
b800: 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  nEq);.  CollSeq 
b810: 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c  *pColl;.  .  sql
b820: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d  ite3_value *p1 =
b830: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b840: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b850: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20  from pLower */. 
b860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b870: 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p2 = 0;         
b880: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b890: 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20  ted from pUpper 
b8a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b8b0: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20  ue *pVal = 0;   
b8c0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b8d0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63  tracted from rec
b8e0: 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20  ord */..  pColl 
b8f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
b900: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b910: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a  ->azColl[nEq]);.
b920: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
b930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b940: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b950: 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  pr(pParse, pLowe
b960: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b970: 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20  , aff, &p1);.   
b980: 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d   nLower = 0;.  }
b990: 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26  .  if( pUpper &&
b9a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b9b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b9c0: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
b9d0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70  Expr(pParse, pUp
b9e0: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
b9f0: 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20  ht, aff, &p2);. 
ba00: 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f     nUpper = p2 ?
ba10: 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b   0 : p->nSample;
ba20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c  .  }..  if( p1 |
ba30: 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  | p2 ){.    int 
ba40: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66  i;.    int nDiff
ba50: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
ba60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ba70: 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  i<p->nSample; i+
ba80: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
ba90: 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d  qlite3Stat4Colum
baa0: 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  n(db, p->aSample
bab0: 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c  [i].p, p->aSampl
bac0: 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56  e[i].n, nEq, &pV
bad0: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
bae0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
baf0: 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p1 ){.        in
bb00: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
bb10: 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56  emCompare(p1, pV
bb20: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
bb30: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
bb40: 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20   nLower++;.     
bb50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
bb60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32  =SQLITE_OK && p2
bb70: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
bb80: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
bb90: 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c  Compare(p2, pVal
bba0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
bbb0: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
bbc0: 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Upper++;.      }
bbd0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66  .    }.    nDiff
bbe0: 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f   = (nUpper - nLo
bbf0: 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  wer);.    if( nD
bc00: 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d  iff<=0 ) nDiff =
bc10: 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   1;..    /* If t
bc20: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
bc30: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
bc40: 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c  bound specified,
bc50: 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
bc60: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64   comparisons ind
bc70: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20  icate that they 
bc80: 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  are close togeth
bc90: 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c  er, use the fall
bca0: 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68  back.    ** meth
bcb0: 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20  od (assume that 
bcc0: 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20  the scan visits 
bcd0: 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73  1/64 of the rows
bce0: 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  ) for estimating
bcf0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
bd00: 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
bd10: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  ed. Otherwise, e
bd20: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
bd30: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a  er of rows.    *
bd40: 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68  * using the meth
bd50: 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  od described in 
bd60: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
bd70: 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  nt for this func
bd80: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
bd90: 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70   nDiff!=1 || pUp
bda0: 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72  per==0 || pLower
bdb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
bdc0: 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69   nAdjust = (sqli
bdd0: 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61  te3LogEst(p->nSa
bde0: 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c  mple) - sqlite3L
bdf0: 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20  ogEst(nDiff));. 
be00: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
be10: 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20   -= nAdjust;.   
be20: 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a     *pbDone = 1;.
be30: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
be40: 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73  (0x10, ("range s
be50: 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73  kip-scan regions
be60: 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74  : %u..%u  adjust
be70: 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  =%d est=%d\n",. 
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72            nLower
bea0: 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73  , nUpper, nAdjus
beb0: 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  t*-1, pLoop->nOu
bec0: 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  t));.    }..  }e
bed0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
bee0: 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20   *pbDone==0 );. 
bef0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
bf00: 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71  ueFree(p1);.  sq
bf10: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
bf20: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  2);.  sqlite3Val
bf30: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
bf40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
bf50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
bf60: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
bf70: 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
bf80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
bf90: 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
bfa0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
bfb0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
bfc0: 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
bfd0: 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
bfe0: 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
bff0: 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
c000: 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
c010: 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
c020: 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
c030: 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
c040: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
c050: 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
c060: 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
c070: 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
c080: 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
c090: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
c0a0: 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
c0b0: 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
c0c0: 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
c0d0: 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
c0e0: 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
c0f0: 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
c100: 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
c120: 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
c130: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c140: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
c150: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
c160: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
c170: 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
c180: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
c190: 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
c1a0: 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
c1b0: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
c1c0: 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
c1d0: 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
c1e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
c1f0: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
c200: 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
c210: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
c220: 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
c230: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
c240: 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73  ndex.** column s
c250: 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61  ubject to the ra
c260: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
c270: 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
c280: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  , the number of.
c290: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
c2a0: 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65  traints optimize
c2b0: 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
c2c0: 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
c2d0: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73  r example,.** as
c2e0: 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69  suming index p i
c2f0: 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  s on t1(a, b), a
c300: 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
c310: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
c320: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
c330: 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
c340: 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
c350: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
c360: 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20  et to 1 (as the 
c370: 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64  range restricted
c380: 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74   column, b, is t
c390: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65  he second .** le
c3a0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
c3b0: 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
c3c0: 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
c3d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
c3e0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
c3f0: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
c400: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
c410: 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a  is set to 0..**.
c420: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
c430: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
c440: 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74   *pnOut is set t
c450: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67  o the sqlite3Log
c460: 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20  Est() of the.** 
c470: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
c480: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63  hat the index sc
c490: 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74  an is expected t
c4a0: 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20  o visit without 
c4b0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  .** considering 
c4c0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
c4d0: 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73  aints. If nEq is
c4e0: 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20   0, then *pnOut 
c4f0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c500: 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65   .** rows in the
c510: 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67   index. Assuming
c520: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c530: 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75  , *pnOut is adju
c540: 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a  sted (reduced).*
c550: 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  * to account for
c560: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
c570: 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e  raints pLower an
c580: 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a  d pUpper..** .**
c590: 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
c5a0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  of sqlite_stat4 
c5b0: 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72  ANALYZE data, or
c5c0: 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61   if such data ca
c5d0: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
c5e0: 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20   a single range 
c5f0: 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63  inequality reduc
c600: 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
c610: 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
c620: 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20  of 4. .** and a 
c630: 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  pair of constrai
c640: 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  nts (x>? AND x<?
c650: 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78  ) reduces the ex
c660: 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
c670: 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64  .** rows visited
c680: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c690: 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  64..*/.static in
c6a0: 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
c6b0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
c6c0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
c6d0: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
c6e0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
c6f0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
c700: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
c710: 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ,.  WhereTerm *p
c720: 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
c730: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c740: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
c750: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c760: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c770: 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
c780: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
c790: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
c7a0: 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
c7b0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
c7c0: 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f  *pLoop     /* Mo
c7d0: 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61  dify the .nOut a
c7e0: 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66  nd maybe .rRun f
c7f0: 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ields */.){.  in
c800: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c810: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70  ;.  int nOut = p
c820: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f  Loop->nOut;.  Lo
c830: 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  gEst nNew;..#ifd
c840: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c850: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
c860: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
c870: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
c880: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
c890: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c8a0: 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  Eq;..  if( p->nS
c8b0: 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70  ample>0 && nEq<p
c8c0: 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a  ->nSampleCol ){.
c8d0: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75      if( nEq==pBu
c8e0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c8f0: 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b   ){.      Unpack
c900: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
c910: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
c920: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61  .      tRowcnt a
c930: 5b 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  [2];.      int n
c940: 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Btm = pLoop->u.b
c950: 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20  tree.nBtm;.     
c960: 20 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f   int nTop = pLoo
c970: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b  p->u.btree.nTop;
c980: 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
c990: 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
c9a0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
c9b0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
c9c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
c9d0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
c9e0: 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
c9f0: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
ca00: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
ca10: 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
ca20: 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
ca30: 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
ca40: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
ca50: 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
ca60: 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
ca70: 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
ca80: 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
ca90: 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
caa0: 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
cab0: 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
cac0: 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
cad0: 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
cae0: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
caf0: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
cb00: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
cb10: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
cb20: 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
cb30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
cb40: 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
cb50: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
cb60: 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
cb70: 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
cb80: 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
cb90: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
cba0: 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
cbb0: 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
cbc0: 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
cbd0: 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
cbe0: 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
cbf0: 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
cc00: 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
cc10: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
cc20: 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
cc30: 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
cc40: 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
cc50: 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
cc60: 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65  ed values is use
cc70: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
cc80: 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
cc90: 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
cca0: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
ccb0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
ccc0: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
ccd0: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
cce0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
ccf0: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
cd00: 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
cd10: 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
cd20: 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
cd30: 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
cd40: 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
cd50: 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
cd60: 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
cd70: 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
cd80: 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
cd90: 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
cda0: 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
cdb0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
cdc0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
cdd0: 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68   rows between th
cde0: 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20  e two bounds is 
cdf0: 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72  then just iUpper
ce00: 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a  -iLower..      *
ce10: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
ce20: 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52  iLower;     /* R
ce30: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
ce40: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
ce50: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
ce60: 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Upper;     /* Ro
ce70: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
ce80: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
ce90: 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64        int iLwrId
cea0: 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61  x = -2;   /* aSa
ceb0: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c  mple[] for the l
cec0: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
ced0: 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20      int iUprIdx 
cee0: 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -1;   /* aSamp
cef0: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70  le[] for the upp
cf00: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20  er bound */..   
cf10: 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20     if( pRec ){. 
cf20: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
cf30: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70   pRec->nField!=p
cf40: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
cf50: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  id );.        pR
cf60: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75  ec->nField = pBu
cf70: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
cf80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cf90: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
cfa0: 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
cfb0: 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
cfc0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  */.      if( nEq
cfd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
cfe0: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
cff0: 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e     iUpper = p->n
d000: 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d  RowEst0;.      }
d010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
d020: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
d030: 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
d040: 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
d050: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
d060: 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a   must .        *
d070: 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  * have been requ
d080: 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69  ested when testi
d090: 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65  ng key $P in whe
d0a0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29  reEqualScanEst()
d0b0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
d0c0: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
d0d0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
d0e0: 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77  a);.        iLow
d0f0: 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
d100: 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
d110: 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   + a[1];.      }
d120: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
d130: 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c  pLower==0 || (pL
d140: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
d150: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
d160: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
d170: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d180: 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  | (pUpper->eOper
d190: 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
d1a0: 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
d1b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f    assert( p->aSo
d1c0: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
d1d0: 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74      if( p->aSort
d1e0: 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20  Order[nEq] ){.  
d1f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c        /* The rol
d200: 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64  es of pLower and
d210: 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70   pUpper are swap
d220: 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69  ped for a DESC i
d230: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
d240: 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c  SWAP(WhereTerm*,
d250: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29   pLower, pUpper)
d260: 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69  ;.        SWAP(i
d270: 6e 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b  nt, nBtm, nTop);
d280: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d290: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
d2a0: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
d2b0: 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75  Lower estimate u
d2c0: 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f  sing ($P:$L). */
d2d0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65  .      if( pLowe
d2e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
d2f0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
d300: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73         /* Values
d310: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
d320: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
d330: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
d340: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
d350: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
d360: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
d370: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
d380: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
d390: 45 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c  Expr, nBtm, nEq,
d3a0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66   &n);.        if
d3b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d3c0: 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  && n ){.        
d3d0: 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
d3e0: 20 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61            u16 ma
d3f0: 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45  sk = WO_GT|WO_LE
d400: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d410: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d420: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29  rSize(pExpr)>n )
d430: 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57   mask = (WO_LE|W
d440: 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20  O_LT);.         
d450: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
d460: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
d470: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
d480: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
d490: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
d4a0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d  r->eOperator & m
d4b0: 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  ask) ? a[1] : 0)
d4c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d4d0: 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
d4e0: 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
d4f0: 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20         nOut--;. 
d500: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
d510: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
d520: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d530: 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
d540: 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70  prove on the iUp
d550: 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  per estimate usi
d560: 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20  ng ($P:$U). */. 
d570: 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
d580: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
d590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5a0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65       /* Values e
d5b0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
d5c0: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
d5d0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
d5e0: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
d5f0: 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
d600: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
d610: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
d620: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
d630: 70 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26  pr, nTop, nEq, &
d640: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
d650: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d660: 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   n ){.          
d670: 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
d680: 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b          u16 mask
d690: 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a   = WO_GT|WO_LE;.
d6a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
d6b0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
d6c0: 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d  ize(pExpr)>n ) m
d6d0: 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f  ask = (WO_LE|WO_
d6e0: 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  LT);.          i
d6f0: 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
d700: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
d710: 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
d720: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
d730: 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
d740: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73  >eOperator & mas
d750: 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  k) ? a[1] : 0);.
d760: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
d770: 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
d780: 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
d790: 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
d7a0: 20 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20         pUpper = 
d7b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d7c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69     }..      pBui
d7d0: 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
d7e0: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  c;.      if( rc=
d7f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d800: 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
d810: 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20  >iLower ){.     
d820: 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69       nNew = sqli
d830: 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72  te3LogEst(iUpper
d840: 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - iLower);.    
d850: 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
d860: 20 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72    If both iUpper
d870: 20 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20   and iLower are 
d880: 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65  derived from the
d890: 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
d8a0: 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ** sample, then 
d8b0: 61 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20  assume they are 
d8c0: 34 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  4x more selectiv
d8d0: 65 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a  e.  This brings.
d8e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
d8f0: 20 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63   estimated selec
d900: 74 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c  tivity more in l
d910: 69 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74  ine with what it
d920: 20 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20   would be.      
d930: 20 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61      ** if estima
d940: 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  ted without the 
d950: 75 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74  use of STAT3/4 t
d960: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ables. */.      
d970: 20 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d      if( iLwrIdx=
d980: 3d 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20  =iUprIdx ) nNew 
d990: 2d 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20  -= 20;  assert( 
d9a0: 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
d9b0: 74 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(4) );.        
d9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d9d0: 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20   nNew = 10;     
d9e0: 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73     assert( 10==s
d9f0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
da00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
da10: 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
da20: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
da30: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  nOut = nNew;.   
da40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57       }.        W
da50: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20  HERETRACE(0x10, 
da60: 28 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63  ("STAT4 range sc
da70: 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d  an: %u..%u  est=
da80: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28    (u32)iLower, (
dab0: 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74  u32)iUpper, nOut
dac0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
dad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
dae0: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20   bDone = 0;.    
daf0: 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
db00: 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61  eSkipScanEst(pPa
db10: 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rse, pLower, pUp
db20: 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f  per, pLoop, &bDo
db30: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ne);.      if( b
db40: 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63  Done ) return rc
db50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
db60: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
db70: 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
db80: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
db90: 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73  (pBuilder);.  as
dba0: 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
dbb0: 70 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66  pUpper );.#endif
dbc0: 0a 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65  .  assert( pUppe
dbd0: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
dbe0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
dbf0: 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e  VNULL)==0 );.  n
dc00: 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65  New = whereRange
dc10: 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e  Adjust(pLower, n
dc20: 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  Out);.  nNew = w
dc30: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
dc40: 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a  pUpper, nNew);..
dc50: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
dc60: 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
dc70: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
dc80: 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68   limit and neith
dc90: 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61  er limit.  ** ha
dca0: 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  s an application
dcb0: 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68  -defined likelih
dcc0: 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68  ood(), assume th
dcd0: 65 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20  e range is.  ** 
dce0: 72 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64  reduced by an ad
dcf0: 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68  ditional 75%. Th
dd00: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62  is means that, b
dd10: 79 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70  y default, an op
dd20: 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61  en-ended.  ** ra
dd30: 6e 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20  nge query (e.g. 
dd40: 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75  col > ?) is assu
dd50: 6d 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34  med to match 1/4
dd60: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20   of the rows in 
dd70: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20  the.  ** index. 
dd80: 57 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72  While a closed r
dd90: 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42  ange (e.g. col B
dda0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20  ETWEEN ? AND ?) 
ddb0: 69 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a  is estimated to.
ddc0: 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20    ** match 1/64 
ddd0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f  of the index. */
dde0: 20 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26   .  if( pLower &
ddf0: 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50  & pLower->truthP
de00: 72 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20  rob>0 && pUpper 
de10: 26 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68  && pUpper->truth
de20: 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e  Prob>0 ){.    nN
de30: 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20  ew -= 20;.  }.. 
de40: 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
de50: 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
de60: 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
de70: 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
de80: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
de90: 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69   nOut = nNew;.#i
dea0: 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
deb0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20  RACE_ENABLED).  
dec0: 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e  if( pLoop->nOut>
ded0: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52  nOut ){.    WHER
dee0: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61  ETRACE(0x10,("Ra
def0: 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20  nge scan lowers 
df00: 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20  nOut from %d to 
df10: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
df20: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
df30: 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a  ->nOut, nOut));.
df40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f    }.#endif.  pLo
df50: 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
df60: 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72  st)nOut;.  retur
df70: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
df80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
df90: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
dfa0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
dfb0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
dfc0: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
dfd0: 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
dfe0: 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
dff0: 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
e000: 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
e010: 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
e020: 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
e030: 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
e040: 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
e050: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
e060: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
e070: 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
e080: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
e090: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
e0a0: 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
e0b0: 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
e0c0: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
e0d0: 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
e0e0: 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
e0f0: 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
e100: 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
e110: 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
e120: 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
e130: 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
e140: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
e150: 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
e160: 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
e170: 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
e180: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
e190: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
e1a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e1b0: 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
e1c0: 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
e1d0: 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
e1e0: 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
e1f0: 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
e200: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
e210: 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
e220: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
e230: 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
e240: 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
e250: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
e260: 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
e270: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
e280: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
e290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
e2a0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
e2b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e2c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e2d0: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
e2e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e2f0: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
e300: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
e310: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
e320: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
e330: 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
e340: 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
e350: 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63  raint */.  tRowc
e360: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
e370: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
e380: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
e390: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
e3a0: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
e3b0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
e3c0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
e3d0: 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nEq = pBuilder->
e3e0: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
e3f0: 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  q;.  UnpackedRec
e400: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
e410: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e  lder->pRec;.  in
e420: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
e430: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
e440: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
e450: 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
e460: 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
e470: 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
e480: 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
e490: 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
e4a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
e4b0: 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
e4c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
e4d0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
e4e0: 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
e4f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e500: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e510: 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
e520: 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
e530: 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
e540: 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
e550: 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
e560: 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
e570: 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
e580: 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
e590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e5a0: 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
e5b0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e5c0: 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
e5d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e5e0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
e5f0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
e600: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
e610: 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
e620: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
e630: 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
e640: 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
e650: 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
e660: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
e670: 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
e680: 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
e690: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e6a0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
e6b0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
e6c0: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
e6d0: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
e6e0: 78 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26  xpr, 1, nEq-1, &
e6f0: 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
e700: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
e710: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e720: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e730: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
e740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e750: 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
e760: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
e770: 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
e780: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
e790: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
e7a0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
e7b0: 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
e7c0: 65 67 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25  egions %s(%d): %
e7d0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
e7e0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
e7f0: 65 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61  e, nEq-1, (int)a
e800: 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
e810: 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
e820: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e830: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e840: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e850: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
e860: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e870: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
e880: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
e890: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
e8a0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
e8b0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
e8c0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
e8d0: 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
e8e0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
e8f0: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
e900: 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
e910: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
e920: 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
e930: 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
e940: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
e950: 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
e960: 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
e970: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e980: 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
e990: 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
e9a0: 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
e9b0: 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
e9c0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
e9d0: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
e9e0: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
e9f0: 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
ea00: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
ea10: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
ea20: 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
ea30: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
ea40: 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
ea50: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
ea60: 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
ea70: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
ea80: 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
ea90: 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
eaa0: 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
eab0: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
eac0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
ead0: 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
eae0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
eaf0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
eb00: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
eb10: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
eb20: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
eb30: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
eb40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
eb50: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
eb60: 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
eb70: 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
eb80: 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
eb90: 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
eba0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ebb0: 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
ebc0: 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
ebd0: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
ebe0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
ebf0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
ec00: 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73  .  i64 nRow0 = s
ec10: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
ec20: 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  t(p->aiRowLogEst
ec30: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63  [0]);.  int nRec
ec40: 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
ec50: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
ec60: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ec70: 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
ec80: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
ec90: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
eca0: 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
ecb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
ecc0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
ecd0: 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
ece0: 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
ecf0: 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
ed00: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
ed10: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
ed20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ed30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ed40: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
ed50: 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
ed60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
ed70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
ed80: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
ed90: 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e  +){.    nEst = n
eda0: 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77  Row0;.    rc = w
edb0: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
edc0: 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
edd0: 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r, pList->a[i].p
ede0: 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
edf0: 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
ee00: 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  t;.    pBuilder-
ee10: 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
ee20: 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69  cValid;.  }..  i
ee30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ee40: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
ee50: 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52  Est > nRow0 ) nR
ee60: 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20  owEst = nRow0;. 
ee70: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
ee80: 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
ee90: 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
eea0: 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
eeb0: 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %d\n", nRowEst))
eec0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
eed0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
eee0: 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
eef0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ef00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ef10: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
ef20: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66  R_STAT4 */...#if
ef30: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
ef40: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
ef50: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
ef60: 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
ef70: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
ef80: 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
ef90: 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
efa0: 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
efb0: 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
efc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
efd0: 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
efe0: 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
eff0: 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
f000: 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
f010: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74  ;.    char zLeft
f020: 5b 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  [50];.    memcpy
f030: 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
f040: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
f050: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
f060: 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
f070: 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69  [0] = 'V';.    i
f080: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
f090: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20  tor & WO_EQUIV  
f0a0: 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27  ) zType[1] = 'E'
f0b0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
f0c0: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
f0d0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
f0e0: 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20  oin) ) zType[2] 
f0f0: 3d 20 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'L';.    if( p
f100: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f110: 26 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20  & WO_SINGLE ){. 
f120: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
f130: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
f140: 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d  ft),zLeft,"left=
f150: 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
f180: 6f 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  or, pTerm->u.lef
f190: 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65  tColumn);.    }e
f1a0: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
f1b0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
f1c0: 52 29 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e  R)!=0 && pTerm->
f1d0: 75 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a  u.pOrInfo!=0 ){.
f1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f1f0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
f200: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65  eft),zLeft,"inde
f210: 78 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a  xable=0x%lld", .
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e         pTerm->u.
f240: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
f250: 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
f260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f270: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
f280: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74  eft),zLeft,"left
f290: 3d 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66  =%d", pTerm->lef
f2a0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  tCursor);.    }.
f2b0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f2c0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
f2d0: 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20  TERM-%-3d %p %s 
f2e0: 25 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20  %-12s prob=%-3d 
f2f0: 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67  op=0x%03x wtFlag
f300: 73 3d 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20  s=0x%04x",.     
f310: 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20    iTerm, pTerm, 
f320: 7a 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54  zType, zLeft, pT
f330: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
f340: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
f350: 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e  perator, pTerm->
f360: 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  wtFlags);.    if
f370: 28 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20  ( pTerm->iField 
f380: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f390: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 69 46  DebugPrintf(" iF
f3a0: 69 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72  ield=%d\n", pTer
f3b0: 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  m->iField);.    
f3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f3d0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f3e0: 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
f3f0: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
f400: 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70  Expr(0, pTerm->p
f410: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  Expr, 0);.  }.}.
f420: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
f430: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
f440: 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65  D./*.** Show the
f450: 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
f460: 74 20 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75  t of a WhereClau
f470: 73 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  se.*/.void sqlit
f480: 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
f490: 6e 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  nt(WhereClause *
f4a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
f4b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d   for(i=0; i<pWC-
f4c0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
f4d0: 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
f4e0: 28 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  (&pWC->a[i], i);
f4f0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
f500: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
f510: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
f520: 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70  rint a WhereLoop
f530: 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75   object for debu
f540: 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  gging purposes.*
f550: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f560: 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65  ereLoopPrint(Whe
f570: 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
f580: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
f590: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
f5a0: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
f5b0: 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
f5c0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
f5d0: 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74  >nSrc+3)/4;.  st
f5e0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
f5f0: 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  m *pItem = pWInf
f600: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
f610: 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
f620: 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
f630: 3e 70 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b  >pTab;.  Bitmask
f640: 20 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61   mAll = (((Bitma
f650: 73 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d  sk)1)<<(nb*4)) -
f660: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62   1;.  sqlite3Deb
f670: 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
f680: 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
f690: 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f6b0: 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
f6c0: 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
f6d0: 65 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20  ereq & mAll);.  
f6e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f6f0: 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
f720: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
f730: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
f740: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
f750: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
f760: 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
f770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
f780: 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  me;.    if( p->u
f790: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26  .btree.pIndex &&
f7a0: 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   (zName = p->u.b
f7b0: 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
f7c0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
f7d0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  if( strncmp(zNam
f7e0: 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
f7f0: 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29  ndex_", 17)==0 )
f800: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
f810: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
f820: 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20  0(zName) - 1;.  
f830: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61        while( zNa
f840: 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d  me[i]!='_' ) i--
f850: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
f860: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
f870: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f880: 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25  Printf(".%-16s %
f890: 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75  2d", zName, p->u
f8a0: 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20  .btree.nEq);.   
f8b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f8c0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f8d0: 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20  ("%20s","");.   
f8e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f8f0: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
f900: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
f910: 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  r ){.      z = s
f920: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f930: 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c  (%d,\"%s\",%x)",
f940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f950: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f960: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  m, p->u.vtab.idx
f970: 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Str, p->u.vtab.o
f980: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65  mitMask);.    }e
f990: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
f9a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f9b0: 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76  (%d,%x)", p->u.v
f9c0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
f9d0: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f9e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f9f0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
fa00: 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20  %-19s", z);.    
fa10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
fa20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73  .  }.  if( p->ws
fa30: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
fa40: 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71  IPSCAN ){.    sq
fa50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
fa60: 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22  (" f %05x %d-%d"
fa70: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
fa80: 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70  >nLTerm,p->nSkip
fa90: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
faa0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
fab0: 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64  tf(" f %05x N %d
fac0: 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
fad0: 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20  ->nLTerm);.  }. 
fae0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
faf0: 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64  ntf(" cost %d,%d
fb00: 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75  ,%d\n", p->rSetu
fb10: 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  p, p->rRun, p->n
fb20: 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  Out);.  if( p->n
fb30: 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65  LTerm && (sqlite
fb40: 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
fb50: 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  100)!=0 ){.    i
fb60: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
fb70: 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20  0; i<p->nLTerm; 
fb80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
fb90: 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c  eTermPrint(p->aL
fba0: 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20  Term[i], i);.   
fbb0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
fbc0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
fbd0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
fbe0: 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
fbf0: 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
fc00: 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
fc10: 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
fc20: 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
fc30: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
fc40: 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
fc50: 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
fc60: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
fc70: 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
fc80: 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
fc90: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
fca0: 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
fcb0: 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
fcc0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
fcd0: 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
fce0: 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
fcf0: 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
fd00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fd10: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
fd20: 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
fd30: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
fd40: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
fd50: 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
fd60: 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55  ALTABLE|WHERE_AU
fd70: 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  TO_INDEX) ){.   
fd80: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
fd90: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fda0: 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
fdb0: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
fdc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fdd0: 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
fde0: 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
fdf0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
fe00: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
fe10: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
fe20: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
fe30: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
fe40: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
fe50: 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
fe60: 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
fe70: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fe80: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
fe90: 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
fea0: 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
feb0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
fec0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
fed0: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
fee0: 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
fef0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ff00: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
ff10: 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
ff20: 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
ff30: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
ff40: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
ff50: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
ff60: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
ff70: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
ff80: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
ff90: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
ffa0: 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  eNN(db, p->aLTer
ffb0: 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
ffc0: 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
ffd0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
ffe0: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
fff0: 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
10000 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
10010 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
10020 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
10030 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
10040 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
10050 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10060 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
10070 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
10080 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
10090 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
100a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
100b0 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
100c0 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
100d0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
100e0 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
100f0 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
10100 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
10110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10120 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
10130 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
10140 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
10150 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
10160 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
10170 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
10180 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
10190 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54  reeNN(db, p->aLT
101a0 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
101b0 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
101c0 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
101d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
101e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
101f0 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
10200 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
10210 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
10220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
10230 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
10240 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
10250 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
10260 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68  op *pFrom){.  wh
10270 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
10280 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66  n(db, pTo);.  if
10290 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
102a0 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
102b0 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20  ->nLTerm) ){.   
102c0 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c   memset(&pTo->u,
102d0 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e   0, sizeof(pTo->
102e0 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  u));.    return 
102f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
10300 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  T;.  }.  memcpy(
10310 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
10320 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
10330 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
10340 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
10350 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
10360 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
10370 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
10380 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
10390 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
103a0 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
103b0 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
103c0 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
103d0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
103e0 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
103f0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
10400 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
10410 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
10420 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10430 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
10440 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
10450 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
10460 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
10470 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
10480 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
10490 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
104a0 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
104b0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
104c0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
104d0 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
104e0 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
104f0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
10500 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
10510 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
10520 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
10530 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
10540 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10550 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
10560 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
10570 20 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c        WhereLevel
10580 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e   *pLevel = &pWIn
10590 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  fo->a[i];.      
105a0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
105b0 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
105c0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
105d0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
105e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
105f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
10600 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
10610 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
10620 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  }.    sqlite3Whe
10630 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
10640 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20  WInfo->sWC);.   
10650 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
10660 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20  pLoops ){.      
10670 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
10680 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
10690 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f       pWInfo->pLo
106a0 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ops = p->pNextLo
106b0 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
106c0 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
106d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
106e0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
106f0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
10700 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10710 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  E if all of the 
10720 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
10730 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
10740 20 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20   X has the same 
10750 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
10760 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58  at Y.**   (2)  X
10770 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
10780 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33  set of Y.**   (3
10790 29 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65  )  X skips at le
107a0 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75  ast as many colu
107b0 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42  mns as Y.**.** B
107c0 79 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74  y "proper subset
107d0 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58  " we mean that X
107e0 20 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52   uses fewer WHER
107f0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a  E clause terms.*
10800 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61  * than Y and tha
10810 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  t every WHERE cl
10820 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62  ause term used b
10830 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64  y X is also used
10840 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20  .** by Y..**.** 
10850 49 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  If X is a proper
10860 20 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65   subset of Y the
10870 6e 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20  n Y is a better 
10880 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74  choice and ought
10890 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f  .** to have a lo
108a0 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20  wer cost.  This 
108b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
108c0 54 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63  TRUE when that c
108d0 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e  ost .** relation
108e0 73 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64  ship is inverted
108f0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
10900 20 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20   adjusted.  The 
10910 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61  third rule.** wa
10920 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20  s added because 
10930 69 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73  if X uses skip-s
10940 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20  can less than Y 
10950 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a  it still might.*
10960 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65  * deserve a lowe
10970 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69  r cost even if i
10980 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  t is a proper su
10990 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74  bset of Y..*/.st
109a0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
109b0 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
109c0 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57  ubset(.  const W
109d0 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20  hereLoop *pX,   
109e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65      /* First Whe
109f0 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72  reLoop to compar
10a00 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65  e */.  const Whe
10a10 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20  reLoop *pY      
10a20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61    /* Compare aga
10a30 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c  inst this WhereL
10a40 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
10a50 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e  i, j;.  if( pX->
10a60 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70  nLTerm-pX->nSkip
10a70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70   >= pY->nLTerm-p
10a80 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  Y->nSkip ){.    
10a90 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69  return 0; /* X i
10aa0 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  s not a subset o
10ab0 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  f Y */.  }.  if(
10ac0 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d   pY->nSkip > pX-
10ad0 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20  >nSkip ) return 
10ae0 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  0;.  if( pX->rRu
10af0 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
10b00 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
10b10 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
10b20 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
10b30 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10b40 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
10b50 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
10b60 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
10b70 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
10b80 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
10b90 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
10ba0 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
10bb0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
10bc0 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
10bd0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
10be0 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
10bf0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
10c00 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
10c10 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
10c20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
10c30 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
10c40 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
10c50 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
10c60 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
10c70 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
10c80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
10c90 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
10ca0 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
10cb0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
10cc0 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
10cd0 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
10ce0 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
10cf0 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
10d00 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
10d10 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
10d20 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
10d30 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
10d40 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
10d50 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
10d60 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
10d70 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
10d80 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
10d90 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
10da0 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
10db0 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
10dc0 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
10dd0 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
10de0 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
10df0 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
10e00 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
10e10 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
10e20 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
10e30 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
10e40 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
10e50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
10e60 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
10e70 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
10e80 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
10e90 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
10ea0 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
10eb0 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
10ec0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
10ed0 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
10ee0 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
10ef0 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
10f00 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
10f10 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
10f20 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
10f30 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
10f40 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
10f50 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
10f60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
10f70 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
10f80 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
10f90 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
10fa0 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
10fb0 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
10fc0 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
10fd0 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
10fe0 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
10ff0 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
11000 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
11010 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20  set p. */.      
11020 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
11030 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
11040 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
11050 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
11080 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
11090 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
110a0 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20  >nOut-1));.     
110b0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
110c0 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
110d0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
110e0 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
110f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
11100 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
11110 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
11120 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
11130 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
11140 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
11150 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
11160 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
11170 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
11180 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
11190 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
111a0 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  p */.      WHERE
111b0 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
111c0 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
111d0 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
111e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
11200 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
11210 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
11220 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
11230 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  +1));.      pTem
11240 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
11250 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
11260 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
11270 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20  ->nOut + 1;.    
11280 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
11290 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f  earch the list o
112a0 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20  f WhereLoops in 
112b0 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20  *ppPrev looking 
112c0 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e  for one that can
112d0 20 62 65 0a 2a 2a 20 72 65 70 6c 61 63 65 64 20   be.** replaced 
112e0 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a  by pTemplate..**
112f0 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
11300 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65  if pTemplate doe
11310 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20  s not belong on 
11320 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
11330 73 74 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  st..** In other 
11340 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
11350 74 65 20 6f 75 67 68 74 20 74 6f 20 62 65 20 64  te ought to be d
11360 72 6f 70 70 65 64 20 66 72 6f 6d 20 66 75 72 74  ropped from furt
11370 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
11380 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69  n..**.** If pX i
11390 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  s a WhereLoop th
113a0 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  at pTemplate can
113b0 20 72 65 70 6c 61 63 65 2c 20 74 68 65 6e 20 72   replace, then r
113c0 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
113d0 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
113e0 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
113f0 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 72  emplate cannot r
11400 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
11410 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
11420 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64  he list but need
11430 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64  s.** to be added
11440 20 74 6f 20 74 68 65 20 6c 69 73 74 20 61 73 20   to the list as 
11450 61 20 6e 65 77 20 65 6e 74 72 79 2c 20 74 68 65  a new entry, the
11460 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
11470 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 69  er to the.** tai
11480 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  l of the list..*
11490 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f  /.static WhereLo
114a0 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69  op **whereLoopFi
114b0 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72  ndLesser(.  Wher
114c0 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a  eLoop **ppPrev,.
114d0 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
114e0 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a  p *pTemplate.){.
114f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
11500 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76    for(p=(*ppPrev
11510 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  ); p; ppPrev=&p-
11520 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
11530 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
11540 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
11550 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
11560 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
11570 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
11580 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
11590 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
115a0 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
115b0 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
115c0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
115d0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
115e0 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
115f0 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
11600 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
11610 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
11620 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
11630 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
11640 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
11650 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
11660 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
11670 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
11680 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
11690 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
116a0 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
116b0 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
116c0 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
116d0 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
116e0 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
116f0 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
11700 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
11710 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
11720 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11730 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
11740 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
11750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11760 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
11770 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
11780 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
11790 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
117a0 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
117b0 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
117c0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
117d0 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
117e0 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
117f0 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
11800 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
11810 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
11820 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
11830 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
11840 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
11850 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11860 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
11870 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
11880 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61  Any loop using a
11890 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66  n appliation-def
118a0 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50  ined index (or P
118b0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20  RIMARY KEY or.  
118c0 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73    ** UNIQUE cons
118d0 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65  traint) with one
118e0 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73   or more == cons
118f0 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65  traints is bette
11900 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e  r.    ** than an
11910 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11920 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61  . Unless it is a
11930 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20   skip-scan. */. 
11940 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
11950 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
11960 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26  INDEX)!=0.     &
11970 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  & (pTemplate->nS
11980 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  kip)==0.     && 
11990 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
119a0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
119b0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20  XED)!=0.     && 
119c0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
119d0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
119e0 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26  MN_EQ)!=0.     &
119f0 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
11a00 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
11a10 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
11a20 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20  ereq.    ){.    
11a30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11a40 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69      /* If existi
11a50 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  ng WhereLoop p i
11a60 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54  s better than pT
11a70 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61  emplate, pTempla
11a80 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  te can be.    **
11a90 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65   discarded.  Whe
11aa0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
11ab0 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20  er if:.    **   
11ac0 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f  (1)  p has no mo
11ad0 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  re dependencies 
11ae0 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
11af0 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
11b00 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c    p has an equal
11b10 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11b20 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  han pTemplate.  
11b30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
11b40 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
11b50 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
11b60 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31  >prereq    /* (1
11b70 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
11b80 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
11b90 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20  te->rSetup      
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
11bb0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
11bc0 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
11bd0 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bf0 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2b) */.     && 
11c00 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61  p->nOut<=pTempla
11c10 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c30 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2c) */.    ){.
11c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
11c50 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d   /* Discard pTem
11c60 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a  plate */.    }..
11c70 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c      /* If pTempl
11c80 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65  ate is always be
11c90 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65  tter than p, the
11ca0 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20  n cause p to be 
11cb0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20  overwritten.    
11cc0 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
11cd0 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  e.  pTemplate is
11ce0 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69   better than p i
11cf0 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
11d00 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e   pTemplate has n
11d10 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
11d20 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20  es than p, and. 
11d30 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65     **   (2)  pTe
11d40 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71  mplate has an eq
11d50 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
11d60 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f  t than p..    */
11d70 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
11d80 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
11d90 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
11da0 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a  ate->prereq   /*
11db0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
11dc0 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
11dd0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
11e00 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
11e10 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
11e20 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e40 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2b) */.    ){.
11e50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11e60 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
11e70 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a  te->rSetup ); /*
11e80 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
11e90 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
11ea0 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73  break;   /* Caus
11eb0 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
11ec0 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61  itten by pTempla
11ed0 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  te */.    }.  }.
11ee0 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b    return ppPrev;
11ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
11f00 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68   or replace a Wh
11f10 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73  ereLoop entry us
11f20 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
11f30 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a   supplied..**.**
11f40 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   An existing Whe
11f50 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67  reLoop entry mig
11f60 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ht be overwritte
11f70 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d  n if the new tem
11f80 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74  plate.** is bett
11f90 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72  er and has fewer
11fa0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20   dependencies.  
11fb0 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  Or the template 
11fc0 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a  will be ignored.
11fd0 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74  ** and no insert
11fe0 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61   will occur if a
11ff0 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
12000 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61  Loop is faster a
12010 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20  nd has.** fewer 
12020 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
12030 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20  n the template. 
12040 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77   Otherwise a new
12050 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a   WhereLoop is.**
12060 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20   added based on 
12070 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  the template..**
12080 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
12090 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e  >pOrSet is not N
120a0 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65  ULL then we care
120b0 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
120c0 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
120d0 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
120e0 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
120f0 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
12100 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
12110 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
12120 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
12130 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
12140 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
12150 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
12160 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
12170 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
12180 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
12190 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
121a0 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
121b0 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
121c0 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
121d0 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
121e0 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
121f0 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
12200 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
12210 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70   the.** new temp
12220 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
12230 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
12240 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
12250 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
12260 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
12270 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
12280 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
12290 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
122a0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
122b0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
122c0 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
122d0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
122e0 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
122f0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
12300 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
12310 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
12320 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
12330 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
12340 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
12350 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
12360 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
12370 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
12380 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
12390 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
123a0 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
123b0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
123c0 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p;.  WhereInfo *
123d0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
123e0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
123f0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
12400 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
12410 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
12420 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
12430 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
12440 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
12450 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
12460 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
12470 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
12480 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
12490 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  0 ){.    if( pTe
124a0 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29  mplate->nLTerm )
124b0 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
124c0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75  _ENABLED.      u
124d0 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
124e0 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
124f0 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
12500 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
12510 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  sert(pBuilder->p
12520 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65  OrSet, pTemplate
12530 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c  ->prereq, pTempl
12540 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20  ate->rRun,.     
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12570 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b  Template->nOut);
12580 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
12590 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
125a0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
125b0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
125c0 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
125d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
125e0 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20  f(x?"   or-%d:  
125f0 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20  ":"   or-X:  ", 
12600 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  n);.        wher
12610 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
12620 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
12630 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  pWC);.      }.#e
12640 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
12650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
12670 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
12680 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70  WhereLoop to rep
12690 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c  lace with pTempl
126a0 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  ate.  */.  where
126b0 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70  LoopAdjustCost(p
126c0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
126d0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50  Template);.  ppP
126e0 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  rev = whereLoopF
126f0 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66  indLesser(&pWInf
12700 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
12710 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70  late);..  if( pp
12720 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Prev==0 ){.    /
12730 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20  * There already 
12740 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f  exists a WhereLo
12750 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74  op on the list t
12760 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20  hat is better.  
12770 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c    ** than pTempl
12780 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e  ate, so just ign
12790 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ore pTemplate */
127a0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
127b0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
127c0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
127d0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
127e0 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
127f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12800 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20    skip: ");.    
12810 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12820 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12830 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12840 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
12850 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
12860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
12870 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a  = *ppPrev;.  }..
12880 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
12890 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
128a0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
128b0 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f   p[] should be o
128c0 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  verwritten.  ** 
128d0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d  with pTemplate[]
128e0 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20   if p[] exists, 
128f0 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68  or if p==NULL th
12900 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  en allocate a ne
12910 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  w.  ** WhereLoop
12920 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a   and insert it..
12930 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52    */.#if WHERETR
12940 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
12950 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
12960 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
12970 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
12980 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
12990 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
129a0 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20  "replace: ");.  
129b0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
129c0 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
129d0 70 57 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pWC);.      sqli
129e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
129f0 20 20 20 77 69 74 68 3a 20 22 29 3b 0a 20 20 20     with: ");.   
12a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
12a10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12a20 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
12a30 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 4c 6f     }.    whereLo
12a40 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12a50 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12a60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12a70 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
12a80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
12a90 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61  w WhereLoop to a
12aa0 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  dd to the end of
12ab0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20   the list */.   
12ac0 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73   *ppPrev = p = s
12ad0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
12ae0 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  wNN(db, sizeof(W
12af0 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
12b00 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
12b10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12b20 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  KPT;.    whereLo
12b30 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70  opInit(p);.    p
12b40 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b  ->pNextLoop = 0;
12b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
12b60 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   We will be over
12b70 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  writing WhereLoo
12b80 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f  p p[].  But befo
12b90 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a  re we do, first.
12ba0 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67      ** go throug
12bb0 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
12bc0 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74  e list and delet
12bd0 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72  e any other entr
12be0 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20  ies besides.    
12bf0 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20  ** p[] that are 
12c00 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62  also supplated b
12c10 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
12c20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70     WhereLoop **p
12c30 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78  pTail = &p->pNex
12c40 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65  tLoop;.    Where
12c50 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20  Loop *pToDel;.  
12c60 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c    while( *ppTail
12c70 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c   ){.      ppTail
12c80 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
12c90 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70  Lesser(ppTail, p
12ca0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20  Template);.     
12cb0 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29   if( ppTail==0 )
12cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
12cd0 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a  oDel = *ppTail;.
12ce0 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c        if( pToDel
12cf0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12d00 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f     *ppTail = pTo
12d10 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  Del->pNextLoop;.
12d20 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12d30 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12d40 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12d50 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
12d60 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
12d70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12d80 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20  (" delete: ");. 
12d90 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
12da0 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42  Print(pToDel, pB
12db0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
12dc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12dd0 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
12de0 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a  te(db, pToDel);.
12df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
12e00 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
12e10 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
12e20 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
12e30 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
12e40 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
12e50 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
12e60 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
12e70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
12e80 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
12e90 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
12ea0 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
12eb0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
12ec0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12ee0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
12ef0 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
12f00 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
12f10 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12f20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
12f30 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
12f40 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
12f50 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
12f60 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a  an.** index..*.*
12f70 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52  * For every WHER
12f80 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12f90 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12fa0 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12fb0 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20 74  nd which has a t
12fc0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12fd0 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65   assigned by one
12fe0 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   of the likeliho
12ff0 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28  od(),.** likely(
13000 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29  ), or unlikely()
13010 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20   SQL functions, 
13020 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
13030 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  ated number.** o
13040 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
13050 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
13060 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
13070 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65  * TUNING:  For e
13080 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
13090 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
130a0 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
130b0 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
130c0 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  h does not have 
130d0 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75 74  an assigned trut
130e0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68  h probability, h
130f0 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73  euristics.** des
13100 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65  cribed below are
13110 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20   used to try to 
13120 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  estimate the tru
13130 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a  th probability..
13140 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68  ** TODO --> Perh
13150 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65  aps this is some
13160 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64  thing that could
13170 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20   be improved by 
13180 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20  better.** table 
13190 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a  statistics..**.*
131a0 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20 20  * Heuristic 1:  
131b0 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  Estimate the tru
131c0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
131d0 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39  s 93.75%.  The 9
131e0 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63  3.75%.** value c
131f0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31  orresponds to -1
13200 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74   in LogEst notat
13210 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61  ion, so this mea
13220 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20  ns decrement.** 
13230 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
13240 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65  ut field for eve
13250 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63 6c  ry such WHERE cl
13260 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a  ause term..**.**
13270 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20 49   Heuristic 2:  I
13280 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
13290 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
132a0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
132b0 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d   the.** form "x=
132c0 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52 20  =EXPR" and EXPR 
132d0 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e  is not a constan
132e0 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  t 0 or 1, then m
132f0 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20  ake sure the.** 
13300 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77  final output row
13310 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20   estimate is no 
13320 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34  greater than 1/4
13330 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   of the total nu
13340 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
13350 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
13360 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
13370 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58  ssume that x==EX
13380 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a  PR will filter.*
13390 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33  * out at least 3
133a0 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20   out of 4 rows. 
133b0 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f   If EXPR is -1 o
133c0 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  r 0 or 1, then m
133d0 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20  aybe the.** "x" 
133e0 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61  column is boolea
133f0 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20  n or else -1 or 
13400 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d  0 or 1 is a comm
13410 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  on default value
13420 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63  .** on the "x" c
13430 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20  olumn and so in 
13440 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63  that case only c
13450 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ap the output ro
13460 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74  w estimate.** at
13470 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20   1/2 instead of 
13480 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  1/4..*/.static v
13490 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
134a0 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65  putAdjust(.  Whe
134b0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
134c0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
134d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
134e0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
134f0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
13500 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61  to adjust downwa
13510 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rd */.  LogEst n
13520 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f  Row            /
13530 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
13540 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74   in the entire t
13550 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
13560 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
13570 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
13580 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
13590 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
135a0 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
135b0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f  nt i, j, k;.  Lo
135c0 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30  gEst iReduce = 0
135d0 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e  ;    /* pLoop->n
135e0 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65  Out should not e
135f0 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75  xceed nRow-iRedu
13600 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
13610 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
13620 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
13630 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  DEX)==0 );.  for
13640 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70  (i=pWC->nTerm, p
13650 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30  Term=pWC->a; i>0
13660 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i--, pTerm++){
13670 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
13680 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
13690 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72  VIRTUAL)!=0 ) br
136a0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54  eak;.    if( (pT
136b0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
136c0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
136d0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
136e0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
136f0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
13700 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f  Allowed)!=0 ) co
13710 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
13720 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d  j=pLoop->nLTerm-
13730 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
13740 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d       pX = pLoop-
13750 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
13760 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
13770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
13780 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72  ( pX==pTerm ) br
13790 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
137a0 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26  X->iParent>=0 &&
137b0 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50   (&pWC->a[pX->iP
137c0 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29  arent])==pTerm )
137d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
137e0 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
137f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
13800 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
13810 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72        /* If a tr
13820 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
13830 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69  is specified usi
13840 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  ng the likelihoo
13850 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20  d() hints,.     
13860 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74     ** then use t
13870 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70  he probability p
13880 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61  rovided by the a
13890 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  pplication. */. 
138a0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
138b0 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
138c0 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
138d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
138e0 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
138f0 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74 68  f explicit truth
13900 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20   probabilities, 
13910 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20 74  use heuristics t
13920 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65  o.        ** gue
13930 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  ss a reasonable 
13940 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
13950 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  y. */.        pL
13960 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20  oop->nOut--;.   
13970 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
13980 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
13990 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
139a0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
139b0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
139c0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
139d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
139e0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
139f0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  TK_IS );.       
13a00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13a10 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69 67  prIsInteger(pRig
13a20 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d  ht, &k) && k>=(-
13a30 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20  1) && k<=1 ){.  
13a40 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30            k = 10
13a50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
13a60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  e{.            k
13a70 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20   = 20;.         
13a80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
13a90 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65   iReduce<k ) iRe
13aa0 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20  duce = k;.      
13ab0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13ac0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
13ad0 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69  p->nOut > nRow-i
13ae0 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d  Reduce )  pLoop-
13af0 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69  >nOut = nRow - i
13b00 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  Reduce;.}../* .*
13b10 2a 20 54 65 72 6d 20 70 54 65 72 6d 20 69 73 20  * Term pTerm is 
13b20 61 20 76 65 63 74 6f 72 20 72 61 6e 67 65 20 63  a vector range c
13b30 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
13b40 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20 63  ion. The first c
13b50 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20  omparison.** in 
13b60 74 68 65 20 76 65 63 74 6f 72 20 63 61 6e 20 62  the vector can b
13b70 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
13b80 67 20 63 6f 6c 75 6d 6e 20 6e 45 71 20 6f 66 20  g column nEq of 
13b90 74 68 65 20 69 6e 64 65 78 2e 20 54 68 69 73 0a  the index. This.
13ba0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
13bb0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
13bc0 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65  mber of vector e
13bd0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 63 61 6e  lements that can
13be0 20 62 65 20 75 73 65 64 0a 2a 2a 20 61 73 20 70   be used.** as p
13bf0 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
13c00 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
13c10 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
13c20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
13c30 0a 2a 2a 0a 2a 2a 20 20 20 57 48 45 52 45 20 61  .**.**   WHERE a
13c40 20 3d 20 3f 20 41 4e 44 20 28 62 2c 20 63 2c 20   = ? AND (b, c, 
13c50 64 29 20 3e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a  d) > (?, ?, ?).*
13c60 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64  *.** and the ind
13c70 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ex:.**.**   CREA
13c80 54 45 20 49 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20  TE INDEX ... ON 
13c90 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  (a, b, c, d, e).
13ca0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  **.** then this 
13cb0 66 75 6e 63 74 69 6f 6e 20 77 6f 75 6c 64 20 62  function would b
13cc0 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e  e invoked with n
13cd0 45 71 3d 31 2e 20 54 68 65 20 76 61 6c 75 65 20  Eq=1. The value 
13ce0 72 65 74 75 72 6e 65 64 20 69 6e 0a 2a 2a 20 74  returned in.** t
13cf0 68 69 73 20 63 61 73 65 20 69 73 20 33 2e 0a 2a  his case is 3..*
13d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13d10 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e  reRangeVectorLen
13d20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13d30 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
13d40 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13d50 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
13d60 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
13d70 6f 70 65 6e 20 6f 6e 20 70 49 64 78 20 2a 2f 0a  open on pIdx */.
13d80 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
13d90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
13da0 64 65 78 20 74 6f 20 62 65 20 75 73 65 64 20 66  dex to be used f
13db0 6f 72 20 61 20 69 6e 65 71 75 61 6c 69 74 79 20  or a inequality 
13dc0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
13dd0 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20  int nEq,        
13de0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13df0 66 20 70 72 69 6f 72 20 65 71 75 61 6c 69 74 79  f prior equality
13e00 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
13e10 73 61 6d 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  same index */.  
13e20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
13e30 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
13e40 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  or inequality co
13e50 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
13e60 20 69 6e 74 20 6e 43 6d 70 20 3d 20 73 71 6c 69   int nCmp = sqli
13e70 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
13e80 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
13e90 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b  pLeft);.  int i;
13ea0 0a 0a 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  ..  nCmp = MIN(n
13eb0 43 6d 70 2c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  Cmp, (pIdx->nCol
13ec0 75 6d 6e 20 2d 20 6e 45 71 29 29 3b 0a 20 20 66  umn - nEq));.  f
13ed0 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20  or(i=1; i<nCmp; 
13ee0 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 65 73  i++){.    /* Tes
13ef0 74 20 69 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t if comparison 
13f00 69 20 6f 66 20 70 54 65 72 6d 20 69 73 20 63 6f  i of pTerm is co
13f10 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 63 6f  mpatible with co
13f20 6c 75 6d 6e 20 28 69 2b 6e 45 71 29 20 0a 20 20  lumn (i+nEq) .  
13f30 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
13f40 78 2e 20 49 66 20 6e 6f 74 2c 20 65 78 69 74 20  x. If not, exit 
13f50 74 68 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  the loop.  */.  
13f60 20 20 63 68 61 72 20 61 66 66 3b 20 20 20 20 20    char aff;     
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
13f90 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 63 68  finity */.    ch
13fa0 61 72 20 69 64 78 61 66 66 20 3d 20 30 3b 20 20  ar idxaff = 0;  
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13fc0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
13fd0 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43  ffinity */.    C
13fe0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14000 43 6f 6d 70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61  Comparison colla
14010 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
14020 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20  .    Expr *pLhs 
14030 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
14040 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pLeft->x.pList->
14050 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14060 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 54 65  Expr *pRhs = pTe
14070 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
14080 74 3b 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  t;.    if( pRhs-
14090 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
140a0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70  elect ){.      p
140b0 52 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70 53  Rhs = pRhs->x.pS
140c0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
140d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
140e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 68 73  else{.      pRhs
140f0 20 3d 20 70 52 68 73 2d 3e 78 2e 70 4c 69 73 74   = pRhs->x.pList
14100 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
14110 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
14120 6b 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 6f  k that the LHS o
14130 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
14140 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66   is a column ref
14150 65 72 65 6e 63 65 20 74 6f 0a 20 20 20 20 2a 2a  erence to.    **
14160 20 74 68 65 20 72 69 67 68 74 20 63 6f 6c 75 6d   the right colum
14170 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 73  n of the right s
14180 6f 75 72 63 65 20 74 61 62 6c 65 2e 20 41 6e 64  ource table. And
14190 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 0a 20   that the sort. 
141a0 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74     ** order of t
141b0 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
141c0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
141d0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66  he sort order of
141e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
141f0 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d  most index colum
14200 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  n.  */.    if( p
14210 4c 68 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Lhs->op!=TK_COLU
14220 4d 4e 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73  MN .     || pLhs
14230 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 0a  ->iTable!=iCur .
14240 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 43       || pLhs->iC
14250 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43  olumn!=pIdx->aiC
14260 6f 6c 75 6d 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20  olumn[i+nEq] .  
14270 20 20 20 7c 7c 20 70 49 64 78 2d 3e 61 53 6f 72     || pIdx->aSor
14280 74 4f 72 64 65 72 5b 69 2b 6e 45 71 5d 21 3d 70  tOrder[i+nEq]!=p
14290 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
142a0 6e 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq].    ){.    
142b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
142c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
142d0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
142e0 52 4f 57 49 44 20 29 3b 0a 20 20 20 20 61 66 66  ROWID );.    aff
142f0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
14300 65 41 66 66 69 6e 69 74 79 28 70 52 68 73 2c 20  eAffinity(pRhs, 
14310 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
14320 69 74 79 28 70 4c 68 73 29 29 3b 0a 20 20 20 20  ity(pLhs));.    
14330 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33  idxaff = sqlite3
14340 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e  TableColumnAffin
14350 69 74 79 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  ity(pIdx->pTable
14360 2c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29  , pLhs->iColumn)
14370 3b 0a 20 20 20 20 69 66 28 20 61 66 66 21 3d 69  ;.    if( aff!=i
14380 64 78 61 66 66 20 29 20 62 72 65 61 6b 3b 0a 0a  dxaff ) break;..
14390 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
143a0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
143b0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
143c0 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
143d0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
143e0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73  break;.    if( s
143f0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
14400 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  oll->zName, pIdx
14410 2d 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29  ->azColl[i+nEq])
14420 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
14430 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
14440 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f  ** Adjust the co
14450 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74  st C by the cost
14460 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20  Mult facter T.  
14470 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73  This only occurs
14480 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20   if.** compiled 
14490 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e  with -DSQLITE_EN
144a0 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f  ABLE_COSTMULT.*/
144b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
144c0 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23  NABLE_COSTMULT.#
144d0 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
144e0 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
144f0 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23    C += T.#else.#
14500 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
14510 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
14520 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
14530 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61  e have so far ma
14540 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e  tched pBuilder->
14550 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14560 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a  q terms of the .
14570 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e  ** index pIndex.
14580 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e   Try to match on
14590 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  e more..**.** Wh
145a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
145b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69   is called, pBui
145c0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74  lder->pNew->nOut
145d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a   contains the .*
145e0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
145f0 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20   expected to be 
14600 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65  visited by filte
14610 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e  ring using the n
14620 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  Eq .** terms onl
14630 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69  y. If it is modi
14640 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65  fied, this value
14650 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66   is restored bef
14660 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
14670 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
14680 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
14690 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
146a0 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
146b0 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
146c0 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
146d0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
146e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
146f0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
14700 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
14710 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
14720 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
14730 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
14740 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
14750 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
14760 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
14770 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
14780 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
14790 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
147b0 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
147c0 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49  c */.  LogEst nI
147d0 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20  nMul            
147e0 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75         /* log(Nu
147f0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
14800 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f  ns due to IN) */
14810 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
14820 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
14830 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20  er->pWInfo;  /* 
14840 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f  WHERE analyse co
14850 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
14860 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
14870 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
14880 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
14890 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
148a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
148b0 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
148c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
148d0 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20   malloc context 
148e0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
148f0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
14900 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
14910 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72   WhereLoop under
14920 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14930 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14940 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
14950 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72     /* A WhereTer
14960 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72  m under consider
14970 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ation */.  int o
14980 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
14990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
149a0 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  lid operators fo
149b0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
149c0 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
149d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
149e0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
149f0 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a  or WHERE terms *
14a00 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65  /.  Bitmask save
14a10 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  d_prereq;       
14a20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14a30 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70  value of pNew->p
14a40 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73  rereq */.  u16 s
14a50 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20  aved_nLTerm;    
14a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14a70 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
14a80 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a  pNew->nLTerm */.
14a90 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b    u16 saved_nEq;
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
14ac0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
14ad0 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31  tree.nEq */.  u1
14ae0 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20  6 saved_nBtm;   
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b00 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14b10 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
14b20 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73  .nBtm */.  u16 s
14b30 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20  aved_nTop;      
14b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14b50 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
14b60 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
14b70 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  op */.  u16 save
14b80 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
14b90 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14ba0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14bb0 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  w->nSkip */.  u3
14bc0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14be0 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14bf0 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
14c00 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
14c10 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
14c20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
14c30 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
14c40 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72  >nOut */.  int r
14c50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14c70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
14c80 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ca0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
14cb0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
14cc0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
14cd0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
14ce0 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
14cf0 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
14d00 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14d10 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
14d20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
14d30 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
14d40 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
14d50 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
14d60 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
14d70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
14d80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14d90 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52 45 54 52  _BKPT;.  WHERETR
14da0 41 43 45 28 30 78 38 30 30 2c 20 28 22 42 45 47  ACE(0x800, ("BEG
14db0 49 4e 20 61 64 64 42 74 72 65 65 49 64 78 28 25  IN addBtreeIdx(%
14dc0 73 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  s), nEq=%d\n",. 
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d      pProbe->zNam
14df0 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  e, pNew->u.btree
14e00 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72  .nEq));..  asser
14e10 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
14e20 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
14e30 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
14e40 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
14e50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
14e60 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
14e70 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
14e80 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
14e90 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
14ea0 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
14eb0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
14ec0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
14ed0 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b  btree.nBtm==0 );
14ee0 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
14ef0 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c  _EQ|WO_IN|WO_GT|
14f00 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
14f10 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  E|WO_ISNULL|WO_I
14f20 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  S;.  }.  if( pPr
14f30 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
14f40 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
14f50 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
14f60 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72  WO_LE);..  asser
14f70 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
14f80 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
14f90 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64  lumn );..  saved
14fa0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
14fb0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
14fc0 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75  d_nBtm = pNew->u
14fd0 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73  .btree.nBtm;.  s
14fe0 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77  aved_nTop = pNew
14ff0 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
15000 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
15010 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73  pNew->nSkip;.  s
15020 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
15030 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
15040 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
15050 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
15060 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
15070 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
15080 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
15090 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d  >nOut;.  pTerm =
150a0 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
150b0 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e  scan, pBuilder->
150c0 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  pWC, pSrc->iCurs
150d0 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20  or, saved_nEq,. 
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
15100 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e  Probe);.  pNew->
15110 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53  rSetup = 0;.  rS
15120 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
15130 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
15140 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
15150 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28  g(rSize);.  for(
15160 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15170 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
15180 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
15190 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
151a0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
151b0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
151c0 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
151d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
151e0 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
151f0 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
15200 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
15210 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
15220 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
15230 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
15240 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
15250 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
15260 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
15270 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
15280 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
15290 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
152a0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
152b0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
152c0 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
152d0 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
152e0 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69  L)!=0).     && i
152f0 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c  ndexColumnNotNul
15300 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  l(pProbe, saved_
15310 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
15320 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69    continue; /* i
15330 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e  gnore IS [NOT] N
15340 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
15350 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
15360 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  mns */.    }.   
15370 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
15380 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
15390 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
153a0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  nue;..    /* Do 
153b0 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70  not allow the up
153c0 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c  per bound of a L
153d0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
153e0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
153f0 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20  t.    ** to mix 
15400 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e  with a lower ran
15410 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f  ge bound from so
15420 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20  me other source 
15430 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
15440 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
15450 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72  _LIKEOPT && pTer
15460 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
15470 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _LT ) continue;.
15480 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
15490 6c 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69  llow IS constrai
154a0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nts from the WHE
154b0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
154c0 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  used by the.    
154d0 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  ** right table o
154e0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
154f0 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  Only constraints
15500 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
15510 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c  e are.    ** all
15520 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  owed */.    if( 
15530 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
15540 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
15550 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
15560 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
15570 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
15580 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f  oin).     && (eO
15590 70 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53  p & (WO_IS|WO_IS
155a0 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b  NULL))!=0.    ){
155b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
155c0 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
155d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
155e0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
155f0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
15600 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
15610 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
15620 70 50 72 6f 62 65 29 20 26 26 20 73 61 76 65 64  pProbe) && saved
15630 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b  _nEq==pProbe->nK
15640 65 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  eyCol-1 ){.     
15650 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
15660 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c  ags |= SQLITE_BL
15670 44 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  DF_UNIQUE;.    }
15680 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75 69  else{.      pBui
15690 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c  lder->bldFlags |
156a0 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e  = SQLITE_BLDF_IN
156b0 44 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  DEXED;.    }.   
156c0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
156d0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
156e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
156f0 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
15700 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  q;.    pNew->u.b
15710 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
15720 64 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77  d_nBtm;.    pNew
15730 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
15740 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20   saved_nTop;.   
15750 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
15760 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
15770 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
15780 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
15790 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
157a0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
157b0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
157c0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
157d0 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
157e0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
157f0 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
15800 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15810 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
15820 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65  kSelf;..    asse
15830 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20  rt( nInMul==0.  
15840 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
15850 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15860 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20  COLUMN_NULL)!=0 
15870 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
15880 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
15890 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30  RE_COLUMN_IN)!=0
158a0 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
158b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
158c0 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30  ERE_SKIPSCAN)!=0
158d0 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66   .    );..    if
158e0 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b  ( eOp & WO_IN ){
158f0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
15900 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
15910 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
15920 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15930 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
15940 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
15950 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
15960 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
15970 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
15980 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
15990 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
159a0 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
159b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
159c0 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  i;.        nIn =
159d0 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
159e0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
159f0 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  25) );..        
15a00 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
15a10 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  n may actually b
15a20 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78  e of the form (x
15a30 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e  , y) IN (SELECT.
15a40 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ..)..        ** 
15a50 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
15a60 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65  re is a separate
15a70 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f   term for each o
15a80 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20  f (x) and (y).. 
15a90 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
15aa0 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69  r, the nIn multi
15ab0 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c  plier should onl
15ac0 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63  y be applied onc
15ad0 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20  e, not once.    
15ae0 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20      ** for each 
15af0 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66  such term. The f
15b00 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68  ollowing loop ch
15b10 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20  ecks that pTerm 
15b20 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  is the.        *
15b30 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72  * first such ter
15b40 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65  m in use, and se
15b50 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30  ts nIn back to 0
15b60 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a   if it is not. *
15b70 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
15b80 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72  0; i<pNew->nLTer
15b90 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m-1; i++){.     
15ba0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61       if( pNew->a
15bb0 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77  LTerm[i] && pNew
15bc0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
15bd0 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20  pr==pExpr ) nIn 
15be0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
15bf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
15c00 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
15c10 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
15c20 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
15c30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
15c40 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
15c50 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
15c60 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
15c70 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
15c80 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
15c90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
15ca0 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
15cb0 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
15cc0 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
15cd0 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22      ** changes "
15d00 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22  x IN (?)" into "
15d10 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  x=?". */.      }
15d20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15d30 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
15d40 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  S) ){.      int 
15d50 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
15d60 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45  iColumn[saved_nE
15d70 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  q];.      pNew->
15d80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
15d90 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
15da0 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f    assert( saved_
15db0 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72  nEq==pNew->u.btr
15dc0 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20  ee.nEq );.      
15dd0 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  if( iCol==XN_ROW
15de0 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69  ID .       || (i
15df0 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d  Col>0 && nInMul=
15e00 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  =0 && saved_nEq=
15e10 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
15e20 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
15e30 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
15e40 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71   && pProbe->uniq
15e50 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  NotNull==0 ){.  
15e60 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
15e70 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
15e80 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20  NQ_WANTED;.     
15e90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15ea0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15eb0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
15ec0 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  W;.        }.   
15ed0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15ee0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
15ef0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  LL ){.      pNew
15f00 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15f10 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
15f20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
15f30 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  p & (WO_GT|WO_GE
15f40 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
15f50 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54  ase( eOp & WO_GT
15f60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15f70 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20  se( eOp & WO_GE 
15f80 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
15f90 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15fa0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
15fb0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
15fc0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15fd0 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61  e.nBtm = whereRa
15fe0 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
15ff0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
16000 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
16010 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
16020 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b  , pTerm.      );
16030 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
16040 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
16050 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
16060 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
16070 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
16080 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
16090 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
160a0 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
160b0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
160c0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
160d0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
160e0 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
160f0 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
16100 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
16110 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
16120 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
16130 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
16140 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16150 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
16160 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
16170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16180 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
16190 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
161a0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
161b0 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
161c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
161d0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
161e0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
161f0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
16200 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
16210 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
16220 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
16230 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
16240 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16250 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Top = 1;.      }
16260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16270 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
16280 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
16290 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
162a0 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
162b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
162c0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
162d0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
162e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
162f0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
16300 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
16310 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
16320 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  op = whereRangeV
16330 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
16340 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
16350 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
16360 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
16370 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
16380 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
16390 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
163a0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
163b0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
163c0 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
163d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
163e0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
163f0 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
16400 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
16410 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
16420 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
16430 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16440 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
16450 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
16460 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
16470 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
16480 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
16490 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
164a0 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
164b0 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
164c0 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
164d0 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
164e0 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
164f0 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
16500 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
16510 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
16520 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
16530 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
16540 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
16550 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
16560 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
16570 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
16580 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
16590 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
165a0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
165b0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
165c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
165d0 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
165e0 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
165f0 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
16600 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
16610 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
16620 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
16630 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
16640 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
16650 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16660 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
16670 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
16680 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
16690 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
166a0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
166b0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
166c0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
166d0 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a  O_IN|WO_IS) );..
166e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
166f0 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
16700 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  nOut );.      if
16710 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
16720 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ob<=0 && pProbe-
16730 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
16740 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  nEq]>=0 ){.     
16750 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
16760 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
16770 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
16780 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
16790 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
167a0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
167b0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
167c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
167d0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
167e0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
167f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16800 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
16810 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
16820 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16830 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
16840 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
16850 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
16860 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
16870 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
16880 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
16890 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
168a0 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
168b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
168c0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
168d0 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
168e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
168f0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
16900 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
16910 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
16920 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
16930 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
16940 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
16950 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
16960 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16970 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
16980 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
16990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
169a0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
169b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
169c0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
169d0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
169e0 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
169f0 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
16a00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16a10 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16a20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
16a30 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
16a40 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
16a50 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
16a60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
16a70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
16a80 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
16a90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
16aa0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16ab0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
16ac0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
16ad0 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
16ae0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
16af0 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
16b00 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16b10 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
16b20 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
16b30 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
16b40 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
16b50 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
16b60 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
16b70 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
16b80 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
16b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ba0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
16bb0 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
16bc0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
16bd0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
16be0 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
16bf0 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
16c00 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
16c10 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
16c20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
16c30 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
16c40 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
16c50 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
16c60 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
16c70 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
16c80 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
16c90 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
16ca0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
16cb0 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
16cc0 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
16cd0 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
16ce0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
16cf0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
16d00 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
16d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16d20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16d30 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
16d40 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
16d50 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
16d60 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
16d70 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
16d80 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
16d90 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
16da0 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
16db0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
16dc0 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
16dd0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
16de0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
16df0 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
16e00 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
16e10 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
16e20 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
16e30 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
16e40 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
16e50 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
16e60 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
16e70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
16e80 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
16e90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
16ea0 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
16eb0 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
16ec0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
16ed0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
16ee0 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
16ef0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
16f00 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
16f10 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
16f20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
16f30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
16f40 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
16f50 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
16f60 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
16f70 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
16f80 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
16f90 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
16fa0 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
16fb0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
16fc0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
16fd0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
16fe0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
16ff0 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
17000 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
17010 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
17020 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
17030 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
17040 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
17050 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
17060 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
17070 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
17080 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
17090 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
170a0 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
170b0 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
170c0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
170d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
170e0 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
170f0 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
17100 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
17110 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
17120 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
17130 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
17140 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
17150 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
17160 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
17170 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
17180 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17190 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
171a0 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
171b0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
171c0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
171d0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
171e0 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
171f0 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
17200 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17210 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
17220 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
17230 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e  d_nBtm;.  pNew->
17240 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73  u.btree.nTop = s
17250 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65  aved_nTop;.  pNe
17260 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
17270 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
17280 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
17290 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
172a0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
172b0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
172c0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
172d0 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
172e0 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
172f0 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
17300 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
17310 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
17320 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
17330 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
17340 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
17350 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
17360 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
17370 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
17380 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
17390 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
173a0 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
173b0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
173c0 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
173d0 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
173e0 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
173f0 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
17400 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
17410 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
17420 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
17430 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
17440 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
17450 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
17460 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
17470 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
17480 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
17490 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
174a0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
174b0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
174c0 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
174d0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
174e0 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
174f0 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
17500 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
17510 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
17520 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
17530 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
17540 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
17550 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
17560 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
17570 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
17580 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
17590 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
175a0 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
175b0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
175c0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
175d0 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
175e0 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
175f0 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
17600 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
17610 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
17620 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
17630 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
17640 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
17650 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
17660 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
17670 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
17680 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
17690 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
176a0 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
176b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
176c0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
176d0 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
176e0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
176f0 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
17700 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17710 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
17720 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
17730 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
17740 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
17750 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
17760 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
17770 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
17780 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
17790 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
177a0 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
177b0 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
177c0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
177d0 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
177e0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
177f0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
17800 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
17810 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
17820 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
17830 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
17840 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
17850 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17860 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
17870 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
17880 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
17890 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
178a0 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48  Flags;.  }..  WH
178b0 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
178c0 28 22 45 4e 44 20 61 64 64 42 74 72 65 65 49 64  ("END addBtreeId
178d0 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72  x(%s), nEq=%d, r
178e0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17900 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61  Probe->zName, sa
17910 76 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a 20  ved_nEq, rc));. 
17920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17930 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
17940 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17950 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
17960 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
17970 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
17980 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
17990 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
179a0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
179b0 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
179c0 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
179d0 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
179e0 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
179f0 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
17a00 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
17a10 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
17a20 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
17a30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
17a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
17a50 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
17a60 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
17a70 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
17a80 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
17a90 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
17aa0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
17ab0 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
17ac0 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
17ad0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
17ae0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
17af0 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
17b00 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
17b10 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
17b20 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
17b30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
17b40 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
17b50 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
17b60 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17b70 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
17b80 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
17b90 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
17ba0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
17bb0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
17bc0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
17bd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
17be0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
17bf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17c00 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
17c10 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
17c20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
17c30 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
17c40 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
17c50 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
17c60 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17c70 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
17c80 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
17c90 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
17ca0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
17cb0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
17cc0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
17cd0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
17ce0 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
17cf0 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
17d00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17d10 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
17d20 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e  pExpr,aColExpr->
17d30 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  a[jj].pExpr,iCur
17d40 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sor)==0 ){.     
17d50 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
17d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17d80 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17d90 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
17da0 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
17db0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
17dc0 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
17dd0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
17de0 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
17df0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
17e00 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
17e10 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
17e20 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
17e30 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
17e40 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
17e50 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
17e60 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
17e70 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
17e80 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
17e90 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
17ea0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
17eb0 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
17ec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
17ed0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
17ee0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
17ef0 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
17f00 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
17f10 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
17f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
17f30 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
17f40 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
17f50 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
17f60 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
17f70 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
17f80 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
17f90 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
17fa0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
17fb0 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
17fc0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
17fd0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
17fe0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
17ff0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
18000 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
18010 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
18020 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72  rm *pTerm;.  Par
18030 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
18040 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
18050 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
18060 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
18070 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
18080 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
18090 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
180a0 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
180b0 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
180c0 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
180d0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  t;.  }.  if( pPa
180e0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
180f0 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
18100 53 47 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b  SG ) pParse = 0;
18110 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
18120 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
18130 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
18140 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
18150 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
18160 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
18170 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18180 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
18190 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
181a0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
181b0 69 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71  iTab).     && sq
181c0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
181d0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
181e0 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
181f0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
18200 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
18210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18220 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
18230 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
18240 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
18250 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
18260 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
18270 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69  e.** is identifi
18280 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
18290 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
182a0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
182b0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
182c0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
182d0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
182e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
182f0 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
18300 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
18310 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
18320 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
18330 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
18340 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
18350 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
18360 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
18370 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
18380 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
18390 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
183a0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
183b0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
183c0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
183d0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
183e0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
18410 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18420 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
18430 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
18440 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
18450 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
18460 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
18470 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
18480 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
18490 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
184a0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
184b0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
184c0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
184d0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
184e0 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
184f0 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
18500 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
18510 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18520 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
18530 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
18540 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
18550 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18560 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
18570 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
18580 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
18590 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
185a0 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
185b0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
185c0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
185d0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
185e0 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
185f0 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
18600 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
18610 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
18620 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
18630 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
18640 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
18650 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
18660 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
18670 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
18680 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
18690 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
186a0 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
186b0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
186c0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
186d0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
186e0 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
186f0 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
18700 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
18710 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
18720 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
18730 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
18740 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
18750 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
18760 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
18770 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
18780 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
18790 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
187a0 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
187b0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
187c0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
187d0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
187e0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
187f0 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
18800 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
18810 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
18820 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
18830 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
18840 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
18850 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
18860 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
18870 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
18880 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
18890 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
188a0 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
188b0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
188c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
188d0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
188e0 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
188f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
18900 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
18910 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
18920 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
18930 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
18940 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
18950 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20  rereq           
18960 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
18970 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
18980 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
18990 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
189a0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
189b0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
189c0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
189d0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
189f0 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
18a00 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
18a10 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
18a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18a30 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
18a40 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
18a50 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
18a60 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
18a70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
18a80 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
18a90 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
18aa0 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
18ab0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
18ac0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
18ad0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
18ae0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
18af0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
18b00 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
18b10 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18b20 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
18b30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
18b40 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
18b50 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
18b60 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
18b70 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
18b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
18b90 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
18ba0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
18bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
18bc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18bd0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
18be0 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
18bf0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18c00 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
18c10 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
18c20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
18c30 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
18c40 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c60 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
18c70 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
18c80 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
18c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18ca0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
18cb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18cc0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
18cd0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18ce0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
18cf0 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
18d00 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
18d10 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
18d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
18d30 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
18d40 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
18d50 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
18d60 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
18d70 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
18d80 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
18d90 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
18da0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
18db0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
18dc0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
18dd0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
18de0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
18df0 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
18e00 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
18e10 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
18e20 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
18e30 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
18e40 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
18e50 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
18e60 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
18e70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
18e80 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
18e90 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
18ea0 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
18eb0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
18ec0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18ed0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
18ee0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
18ef0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
18f00 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
18f10 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
18f20 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
18f30 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
18f40 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
18f50 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
18f60 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
18f70 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
18f80 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
18f90 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
18fa0 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
18fb0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
18fc0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
18fd0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18ff0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
19000 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
19010 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
19020 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
19030 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
19040 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
19050 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
19060 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
19070 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
19080 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
19090 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
190a0 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
190b0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
190c0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
190d0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
190e0 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
190f0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
19100 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
19110 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
19120 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
19130 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
19140 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
19150 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
19160 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
19170 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
19180 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
19190 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
191a0 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
191b0 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
191c0 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
191d0 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
191e0 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
191f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
19200 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
19210 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
19220 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
19230 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
19240 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
19250 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
19260 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
19270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19280 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
19290 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
192a0 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
192b0 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
192c0 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
192d0 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
192e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
192f0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
19300 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
19310 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
19320 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
19330 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
19340 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
19350 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
19360 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
19370 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
19380 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
19390 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
193a0 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
193b0 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
193c0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
193d0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
193e0 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
193f0 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
19400 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
19410 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
19420 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
19430 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
19440 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
19450 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
19460 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
19470 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
19480 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
19490 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
194a0 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
194b0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
194c0 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
194d0 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
194e0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
194f0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19500 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
19510 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
19520 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
19530 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
19540 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
19550 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
19560 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
19570 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
19580 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
19590 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
195a0 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
195b0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
195c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
195d0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
195e0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
195f0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
19600 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
19610 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
19620 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
19630 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
19640 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
19650 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
19660 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
19670 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
19680 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
19690 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
196a0 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
196b0 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
196c0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
196d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
196e0 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
196f0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
19700 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
19710 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
19720 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
19730 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
19740 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c  bles or 1.375 (L
19750 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65  ogEst=4) for vie
19760 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
19770 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
19780 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
19790 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
197a0 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
197b0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
197c0 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
197d0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
197e0 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
197f0 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
19800 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
19810 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
19820 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
19830 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
19840 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
19850 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
19860 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
19870 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
19880 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
19890 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
198a0 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
198b0 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  ze + 4;.        
198c0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
198d0 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
198e0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
198f0 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
19900 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
19910 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20  etup += 24;.    
19920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
19930 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
19940 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
19950 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
19960 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
19970 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20 70 4e  w->rSetup<0 ) pN
19980 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
19990 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
199a0 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
199b0 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
199c0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
199d0 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
199e0 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
199f0 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
19a00 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
19a10 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
19a20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
19a30 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
19a40 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
19a50 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
19a60 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
19a70 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
19a80 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
19a90 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
19aa0 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
19ab0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
19ac0 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
19ad0 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
19ae0 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
19af0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
19b00 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
19b10 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
19b20 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
19b30 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
19b40 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
19b50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
19b60 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c  ereq = mPrereq |
19b70 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19b80 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
19b90 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
19ba0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
19bb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19bc0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
19bd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
19be0 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
19bf0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
19c00 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
19c10 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
19c20 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
19c30 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
19c40 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
19c50 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
19c60 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
19c70 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
19c80 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
19c90 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
19ca0 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
19cb0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
19cc0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
19cd0 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
19ce0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
19cf0 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
19d00 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
19d10 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
19d20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
19d30 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
19d40 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
19d50 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
19d60 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
19d70 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
19d80 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
19d90 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19da0 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30  u.btree.nBtm = 0
19db0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
19dc0 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20  ree.nTop = 0;.  
19dd0 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
19de0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
19df0 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
19e00 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
19e10 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
19e20 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
19e30 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
19e40 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  q;.    pNew->nOu
19e50 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70  t = rSize;.    p
19e60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
19e70 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
19e80 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
19e90 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
19ea0 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
19eb0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
19ec0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
19ed0 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
19ee0 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
19ef0 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
19f00 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
19f10 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
19f20 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
19f30 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
19f40 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
19f50 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
19f60 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
19f70 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
19f80 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
19f90 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
19fa0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
19fb0 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
19fc0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
19fd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
19fe0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
19ff0 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
1a000 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
1a010 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
1a020 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
1a030 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
1a040 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
1a050 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
1a060 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
1a070 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
1a080 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
1a090 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
1a0a0 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
1a0b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
1a0c0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1a0d0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1a0e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
1a0f0 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
1a100 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1a110 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a120 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
1a130 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1a140 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
1a150 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1a160 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
1a170 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
1a180 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
1a190 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1a1a0 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
1a1b0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
1a1c0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
1a1d0 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70  robe);.        p
1a1e0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  New->wsFlags = (
1a1f0 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49  m==0) ? (WHERE_I
1a200 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e  DX_ONLY|WHERE_IN
1a210 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49  DEXED) : WHERE_I
1a220 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a  NDEXED;.      }.
1a230 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73  .      /* Full s
1a240 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f  can via index */
1a250 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20  .      if( b.   
1a260 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
1a270 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c  (pTab).       ||
1a280 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
1a290 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20  xWhere!=0.      
1a2a0 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
1a2b0 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
1a2c0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
1a2d0 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65        && (pProbe
1a2e0 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
1a2f0 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20  >szTabRow).     
1a300 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
1a310 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1a320 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
1a330 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
1a340 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
1a350 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
1a360 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
1a370 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
1a380 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1a390 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
1a3a0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
1a3b0 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
1a3c0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1a3d0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
1a3e0 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20  dx : 0;..       
1a3f0 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
1a400 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64  visiting the ind
1a410 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20  ex rows is N*K, 
1a420 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20  where K is.     
1a430 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e     ** between 1.
1a440 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e  1 and 3.0, depen
1a450 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61  ding on the rela
1a460 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
1a470 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
1a480 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77  ex and table row
1a490 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
1a4a0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
1a4b0 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
1a4c0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
1a4d0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
1a4e0 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b       if( m!=0 ){
1a4f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1a500 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
1a510 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
1a520 61 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63  an, add in the c
1a530 6f 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ost of.         
1a540 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20   ** doing table 
1a550 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f  lookups.  The co
1a560 73 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68  st will be 3x th
1a570 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
1a580 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73        ** lookups
1a590 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63  .  Take into acc
1a5a0 6f 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  ount WHERE claus
1a5b0 65 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e  e terms that can
1a5c0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
1a5d0 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
1a5e0 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c   just the index,
1a5f0 20 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74   and that do not
1a600 20 72 65 71 75 69 72 65 20 61 0a 20 20 20 20 20   require a.     
1a610 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f       ** table lo
1a620 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20  okup. */.       
1a630 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75     LogEst nLooku
1a640 70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20  p = rSize + 16; 
1a650 20 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20   /* Base cost:  
1a660 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  N*3 */.         
1a670 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1a680 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53     int iCur = pS
1a690 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  rc->iCursor;.   
1a6a0 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
1a6b0 73 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e  se *pWC2 = &pWIn
1a6c0 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20  fo->sWC;.       
1a6d0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1a6e0 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  pWC2->nTerm; ii+
1a6f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1a700 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1a710 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b   = &pWC2->a[ii];
1a720 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a730 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76   !sqlite3ExprCov
1a740 65 72 65 64 42 79 49 6e 64 65 78 28 70 54 65 72  eredByIndex(pTer
1a750 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20  m->pExpr, iCur, 
1a760 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
1a770 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a780 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65            /* pTe
1a7a0 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  rm can be evalua
1a7b0 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ted using just t
1a7c0 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65  he index.  So re
1a7d0 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  duce.           
1a7e0 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65 64   ** the expected
1a7f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
1a800 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69   lookups accordi
1a810 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  ngly */.        
1a820 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
1a830 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
1a850 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  okup += pTerm->t
1a860 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
1a870 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a880 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b             nLook
1a890 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  up--;.          
1a8a0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1a8b0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
1a8c0 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b  Q|WO_IS) ) nLook
1a8d0 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20  up -= 19;.      
1a8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20    }.          . 
1a900 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
1a910 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
1a920 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
1a930 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20  n, nLookup);.   
1a940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
1a950 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
1a960 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
1a970 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
1a980 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
1a990 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
1a9a0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
1a9b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1a9c0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1a9d0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1a9e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1a9f0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
1aa00 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
1aa10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1aa20 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
1aa30 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  bldFlags = 0;.  
1aa40 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1aa50 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
1aa60 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
1aa70 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  robe, 0);.    if
1aa80 28 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46  ( pBuilder->bldF
1aa90 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44  lags==SQLITE_BLD
1aaa0 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  F_INDEXED ){.   
1aab0 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75     /* If a non-u
1aac0 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75  nique index is u
1aad0 73 65 64 2c 20 6f 72 20 69 66 20 61 20 70 72 65  sed, or if a pre
1aae0 66 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 66  fix of the key f
1aaf0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71  or.      ** uniq
1ab00 75 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  ue index is used
1ab10 20 28 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e 64   (making the ind
1ab20 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20  ex functionally 
1ab30 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20 20  non-unique).    
1ab40 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 71    ** then the sq
1ab50 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 20  lite_stat1 data 
1ab60 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e  becomes importan
1ab70 74 20 66 6f 72 20 73 63 6f 72 69 6e 67 20 74 68  t for scoring th
1ab80 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20  e.      ** plan 
1ab90 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  */.      pTab->t
1aba0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74  abFlags |= TF_St
1abb0 61 74 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23  atsUsed;.    }.#
1abc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1abd0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
1abe0 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
1abf0 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
1ac00 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
1ac10 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
1ac20 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
1ac30 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
1ac40 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
1ac50 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1ac60 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1ac70 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
1ac80 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
1ac90 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
1aca0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
1acb0 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20  Src->pIBIndex ) 
1acc0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1acd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1ace0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1acf0 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a  IRTUALTABLE../*.
1ad00 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  ** Argument pIdx
1ad10 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20  Info is already 
1ad20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
1ad30 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ll constraints t
1ad40 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
1ad50 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61  ed by the virtua
1ad60 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  l table identifi
1ad70 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
1ad80 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73  pNew->iTab. This
1ad90 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72  .** function mar
1ada0 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ks a subset of t
1adb0 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hose constraints
1adc0 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73   usable, invokes
1add0 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64   the.** xBestInd
1ade0 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64  ex method and ad
1adf0 64 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ds the returned 
1ae00 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72  plan to pBuilder
1ae10 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72  ..**.** A constr
1ae20 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75  aint is marked u
1ae30 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  sable if:.**.** 
1ae40 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73    * Argument mUs
1ae50 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74  able indicates t
1ae60 68 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69  hat its prerequi
1ae70 73 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61  sites are availa
1ae80 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ble, and.**.**  
1ae90 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65   * It is not one
1aea0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1aeb0 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
1aec0 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b  he mExclude mask
1aed0 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61   passed.**     a
1aee0 73 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  s the fourth arg
1aef0 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20  ument (which in 
1af00 70 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68  practice is eith
1af10 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a  er WO_IN or 0)..
1af20 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d  **.** Argument m
1af30 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b  Prereq is a mask
1af40 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
1af50 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1af60 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69  before the.** vi
1af70 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71  rtual table in q
1af80 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61  uestion. These a
1af90 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
1afa0 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69  plans prerequisi
1afb0 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74  tes.** before it
1afc0 20 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75   is added to pBu
1afd0 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74  ilder..**.** Out
1afe0 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
1aff0 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72  bIn is set to tr
1b000 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61  ue if the plan a
1b010 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1b020 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  .** uses one or 
1b030 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73  more WO_IN terms
1b040 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
1b050 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1b060 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1b070 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68  VirtualOne(.  Wh
1b080 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1b090 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d  pBuilder,.  Bitm
1b0a0 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20  ask mPrereq,    
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1b0c0 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
1b0d0 61 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e  at must be used.
1b0e0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
1b0f0 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  sable,          
1b100 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1b110 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a   usable tables *
1b120 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65  /.  u16 mExclude
1b130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b140 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74      /* Exclude t
1b150 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65  erms using these
1b160 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
1b170 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1b180 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20  fo *pIdxInfo,   
1b190 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a  /* Populated obj
1b1a0 65 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64  ect for xBestInd
1b1b0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f  ex */.  u16 mNoO
1b1c0 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mit,            
1b1d0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1b1e0 74 20 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e  t omit these con
1b1f0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
1b200 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20  t *pbIn         
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b220 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c   OUT: True if pl
1b230 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  an uses an IN(..
1b240 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68  .) op */.){.  Wh
1b250 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
1b260 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1b270 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
1b280 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1b290 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
1b2a0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1b2b0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
1b2c0 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70  sage *pUsage = p
1b2d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b2e0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74  aintUsage;.  int
1b2f0 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d   i;.  int mxTerm
1b300 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b310 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
1b320 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69  oop *pNew = pBui
1b330 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61  lder->pNew;.  Pa
1b340 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42  rse *pParse = pB
1b350 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
1b360 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74  pParse;.  struct
1b370 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b380 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d  Src = &pBuilder-
1b390 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
1b3a0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
1b3b0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
1b3c0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
1b3d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  nConstraint;..  
1b3e0 61 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65  assert( (mUsable
1b3f0 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72   & mPrereq)==mPr
1b400 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20  ereq );.  *pbIn 
1b410 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  = 0;.  pNew->pre
1b420 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a  req = mPrereq;..
1b430 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61    /* Set the usa
1b440 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  ble flag on the 
1b450 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72  subset of constr
1b460 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64  aints identified
1b470 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65   by .  ** argume
1b480 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20  nts mUsable and 
1b490 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70  mExclude. */.  p
1b4a0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1b4b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b4c0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1b4d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b4e0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1b4f0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b500 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1b510 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
1b520 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
1b530 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d  [pIdxCons->iTerm
1b540 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64  Offset];.    pId
1b550 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
1b560 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  0;.    if( (pTer
1b570 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
1b580 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d   mUsable)==pTerm
1b590 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20  ->prereqRight . 
1b5a0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
1b5b0 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c  Operator & mExcl
1b5c0 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  ude)==0.    ){. 
1b5d0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
1b5e0 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  sable = 1;.    }
1b5f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
1b600 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
1b610 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
1b620 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1b630 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  o structure */. 
1b640 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
1b650 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
1b660 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74  [0])*nConstraint
1b670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
1b680 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1b690 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20  eIdxStr==0 );.  
1b6a0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1b6b0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1b6c0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
1b6d0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1b6e0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
1b6f0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
1b700 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
1b710 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
1b720 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66  ble)2;.  pIdxInf
1b730 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
1b740 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66   = 25;.  pIdxInf
1b750 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b  o->idxFlags = 0;
1b760 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c  .  pIdxInfo->col
1b770 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  Used = (sqlite3_
1b780 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55  int64)pSrc->colU
1b790 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  sed;..  /* Invok
1b7a0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
1b7b0 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  ble xBestIndex()
1b7c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20   method */.  rc 
1b7d0 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
1b7e0 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54  pParse, pSrc->pT
1b7f0 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
1b800 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b810 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d   rc;..  mxTerm =
1b820 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70   -1;.  assert( p
1b830 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
1b840 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f  nstraint );.  fo
1b850 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1b860 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
1b870 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
1b880 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1b890 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  mitMask = 0;.  p
1b8a0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1b8b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b8c0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1b8d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b8e0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1b8f0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b900 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1b910 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b  {.    int iTerm;
1b920 0a 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20  .    if( (iTerm 
1b930 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
1b940 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
1b950 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1b960 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69   *pTerm;.      i
1b970 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d  nt j = pIdxCons-
1b980 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
1b990 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
1b9a0 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
1b9b0 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
1b9c0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
1b9d0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
1b9e0 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
1b9f0 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  0.       || pIdx
1ba00 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a  Cons->usable==0.
1ba10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1ba20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1ba30 4f 52 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  OR;.        sqli
1ba40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ba50 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65  se,"%s.xBestInde
1ba60 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70  x malfunction",p
1ba70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
1ba80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1ba90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1baa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1bab0 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
1bac0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
1bad0 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
1bae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1baf0 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
1bb00 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
1bb10 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
1bb20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
1bb30 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1bb40 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
1bb50 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
1bb60 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
1bb70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
1bb80 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
1bb90 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
1bba0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
1bbb0 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  erm;.      testc
1bbc0 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
1bbd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bbe0 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
1bbf0 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
1bc00 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
1bc10 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
1bc20 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
1bc30 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  <<iTerm;.      i
1bc40 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1bc50 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
1bc60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1bc70 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
1bc80 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
1bc90 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
1bca0 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
1bcb0 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
1bcc0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1bcd0 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
1bce0 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
1bcf0 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  rms.        ** i
1bd00 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1bd10 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
1bd20 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
1bd30 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
1bd40 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
1bd50 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
1bd60 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
1bd70 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
1bd80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65  .        ** toge
1bd90 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
1bda0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
1bdb0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
1bdc0 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
1bdd0 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e  o->idxFlags &= ~
1bde0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1bdf0 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  N_UNIQUE;.      
1be00 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73    *pbIn = 1; ass
1be10 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26  ert( (mExclude &
1be20 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20   WO_IN)==0 );.  
1be30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1be40 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1be50 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f  mitMask &= ~mNoO
1be60 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c  mit;..  pNew->nL
1be70 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
1be80 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1be90 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
1bea0 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d  LSlot );.  pNew-
1beb0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d  >u.vtab.idxNum =
1bec0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1bed0 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  m;.  pNew->u.vta
1bee0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
1bef0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1bf00 65 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49  eIdxStr;.  pIdxI
1bf10 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1bf20 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65  dxStr = 0;.  pNe
1bf30 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
1bf40 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1bf50 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  Str;.  pNew->u.v
1bf60 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  tab.isOrdered = 
1bf70 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f  (i8)(pIdxInfo->o
1bf80 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f  rderByConsumed ?
1bf90 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
1bfa0 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a  >nOrderBy : 0);.
1bfb0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1bfc0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e   0;.  pNew->rRun
1bfd0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1bfe0 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
1bff0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1c000 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  st);.  pNew->nOu
1c010 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
1c020 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
1c030 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f  matedRows);..  /
1c040 2a 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f  * Set the WHERE_
1c050 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74  ONEROW flag if t
1c060 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  he xBestIndex() 
1c070 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64  method indicated
1c080 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1c090 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61  can will visit a
1c0a0 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20  t most one row. 
1c0b0 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69  Clear it otherwi
1c0c0 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  se. */.  if( pId
1c0d0 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1c0e0 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  & SQLITE_INDEX_S
1c0f0 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20  CAN_UNIQUE ){.  
1c100 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1c110 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
1c120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1c130 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  ew->wsFlags &= ~
1c140 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1c150 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  }.  rc = whereLo
1c160 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1c170 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  r, pNew);.  if( 
1c180 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1c190 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  dFree ){.    sql
1c1a0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
1c1b0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
1c1c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1c1d0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1c1e0 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
1c1f0 30 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d  0xffff, ("  bIn=
1c200 25 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c  %d prereqIn=%04l
1c210 6c 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34  lx prereqOut=%04
1c220 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llx\n",.        
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
1c240 62 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  bIn, (sqlite3_ui
1c250 6e 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20  nt64)mPrereq,.  
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e      (sqlite3_uin
1c280 74 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65  t64)(pNew->prere
1c290 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b  q & ~mPrereq)));
1c2a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c2b0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  .../*.** Add all
1c2c0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1c2d0 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
1c2e0 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
1c2f0 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
1c300 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1c310 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
1c320 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1c330 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
1c340 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1c350 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72  e are no LEFT or
1c360 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e   CROSS JOIN join
1c370 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20  s in the query, 
1c380 62 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64  both mPrereq and
1c390 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72  .** mUnusable ar
1c3a0 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65  e set to 0. Othe
1c3b0 72 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69  rwise, mPrereq i
1c3c0 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
1c3d0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
1c3e0 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
1c3f0 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
1c400 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
1c410 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
1c420 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
1c430 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1c440 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1c450 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
1c460 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
1c470 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
1c480 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
1c490 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
1c4a0 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
1c4b0 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
1c4c0 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
1c4d0 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
1c4e0 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
1c4f0 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
1c500 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
1c510 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1c520 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
1c530 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
1c540 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
1c550 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
1c560 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
1c570 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72  **.** then mPrer
1c580 65 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  eq corresponds t
1c590 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d  o (t1, t2) and m
1c5a0 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c  Unusable to (t5,
1c5b0 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20   t6)..**.** All 
1c5c0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50  the tables in mP
1c5d0 72 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63  rereq must be sc
1c5e0 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1c5f0 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1c600 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61   .** table. So a
1c610 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1c620 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73  ch all prerequis
1c630 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69  ites are satisfi
1c640 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65  ed by .** mPrere
1c650 71 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  q may be specifi
1c660 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
1c670 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
1c680 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
1c690 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
1c6a0 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
1c6b0 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
1c6c0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
1c6d0 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
1c6e0 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
1c6f0 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
1c700 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
1c710 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
1c720 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
1c730 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
1c740 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
1c750 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
1c760 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1c770 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1c780 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
1c790 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1c7a0 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
1c7b0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
1c7c0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
1c7d0 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20   mPrereq,       
1c7e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1c7f0 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1c800 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
1c810 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
1c820 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
1c830 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
1c840 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1c850 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
1c860 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   one */.){.  int
1c870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c890 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68  urn code */.  Wh
1c8a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1c8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
1c8c0 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
1c8d0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
1c8e0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1c8f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1c900 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c910 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1c920 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
1c930 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1c940 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1c950 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1c960 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1c970 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1c980 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c   search */.  sql
1c990 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1c9a0 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a  *p;       /* Obj
1c9b0 65 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ect to pass to x
1c9c0 42 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20  BestIndex() */. 
1c9d0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1c9e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c9f0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1ca00 72 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20  raints in p */. 
1ca10 20 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20   int bIn;       
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca30 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1ca40 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  es IN(...) opera
1ca50 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  tor */.  WhereLo
1ca60 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d  op *pNew;.  Bitm
1ca70 61 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20  ask mBest;      
1ca80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ca90 65 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20  es used by best 
1caa0 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f  possible plan */
1cab0 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a  .  u16 mNoOmit;.
1cac0 0a 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65  .  assert( (mPre
1cad0 72 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29  req & mUnusable)
1cae0 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20  ==0 );.  pWInfo 
1caf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1cb00 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
1cb10 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1cb20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
1cb30 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
1cb40 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1cb50 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
1cb60 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
1cb70 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65  w->iTab];.  asse
1cb80 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53  rt( IsVirtual(pS
1cb90 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70  rc->pTab) );.  p
1cba0 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
1cbb0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
1cbc0 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72  , mUnusable, pSr
1cbd0 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  c, pBuilder->pOr
1cbe0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d  derBy, .      &m
1cbf0 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70  NoOmit);.  if( p
1cc00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1cc10 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1cc20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1cc30 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
1cc40 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
1cc50 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
1cc60 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
1cc70 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1cc80 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f  dFree = 0;.  nCo
1cc90 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43  nstraint = p->nC
1cca0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
1ccb0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
1ccc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65  (pParse->db, pNe
1ccd0 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
1cce0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1ccf0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1cd00 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   p);.    return 
1cd10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1cd20 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  T;.  }..  /* Fir
1cd30 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64  st call xBestInd
1cd40 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f  ex() with all co
1cd50 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
1cd60 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  . */.  WHERETRAC
1cd70 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1cd80 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1cd90 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20  le\n"));.  rc = 
1cda0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1cdb0 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1cdc0 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1cdd0 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  S, 0, p, mNoOmit
1cde0 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49  , &bIn);..  /* I
1cdf0 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42  f the call to xB
1ce00 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20  estIndex() with 
1ce10 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65  all terms enable
1ce20 64 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61  d produced a pla
1ce30 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73  n.  ** that does
1ce40 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
1ce50 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28   source tables (
1ce60 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68  IOW: a plan with
1ce70 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a   mBest==0),.  **
1ce80 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
1ce90 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e  o point in makin
1cea0 67 20 61 6e 79 20 66 75 72 74 68 65 72 20 63 61  g any further ca
1ceb0 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1cec0 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  x() .  ** since 
1ced0 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65  they will all re
1cee0 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65  turn the same re
1cef0 73 75 6c 74 20 28 69 66 20 74 68 65 20 78 42 65  sult (if the xBe
1cf00 73 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69  stIndex().  ** i
1cf10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
1cf20 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28   sane). */.  if(
1cf30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cf40 26 20 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77  & (mBest = (pNew
1cf50 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65  ->prereq & ~mPre
1cf60 72 65 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  req))!=0 ){.    
1cf70 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30  int seenZero = 0
1cf80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1cf90 20 54 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20   True if a plan 
1cfa0 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20  with no prereqs 
1cfb0 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  seen */.    int 
1cfc0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30  seenZeroNoIN = 0
1cfd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;         /* Pla
1cfe0 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71  n with no prereq
1cff0 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29  s and no IN(...)
1d000 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74   seen */.    Bit
1d010 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a  mask mPrev = 0;.
1d020 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73      Bitmask mBes
1d030 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  tNoIn = 0;..    
1d040 2f 2a 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70  /* If the plan p
1d050 72 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 65  roduced by the e
1d060 61 72 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73  arlier call uses
1d070 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d   an IN(...) term
1d080 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42  , call.    ** xB
1d090 65 73 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20  estIndex again, 
1d0a0 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 49  this time with I
1d0b0 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73  N(...) terms dis
1d0c0 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  abled. */.    if
1d0d0 28 20 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57  ( bIn ){.      W
1d0e0 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1d0f0 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1d100 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49  all usable w/o I
1d110 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  N\n"));.      rc
1d120 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1d130 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1d140 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1d150 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c  Prereq, ALLBITS,
1d160 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d   WO_IN, p, mNoOm
1d170 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1d180 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20   assert( bIn==0 
1d190 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f  );.      mBestNo
1d1a0 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  In = pNew->prere
1d1b0 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20  q & ~mPrereq;.  
1d1c0 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49      if( mBestNoI
1d1d0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1d1e0 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1d1f0 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f        seenZeroNo
1d200 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1d210 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
1d220 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e  ll xBestIndex on
1d230 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ce for each dist
1d240 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70  inct value of (p
1d250 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1d260 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69  rereq) .    ** i
1d270 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72  n the set of ter
1d280 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f  ms that apply to
1d290 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1d2a0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  tual table.  */.
1d2b0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
1d2c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d2d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42    int i;.      B
1d2e0 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41  itmask mNext = A
1d2f0 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73  LLBITS;.      as
1d300 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b  sert( mNext>0 );
1d310 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d320 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1d330 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
1d340 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20  mask mThis = (. 
1d350 20 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e             pWC->
1d360 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  a[p->aConstraint
1d370 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d  [i].iTermOffset]
1d380 2e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e  .prereqRight & ~
1d390 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20  mPrereq.        
1d3a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1d3b0 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54  This>mPrev && mT
1d3c0 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78  his<mNext ) mNex
1d3d0 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20  t = mThis;.     
1d3e0 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d   }.      mPrev =
1d3f0 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66   mNext;.      if
1d400 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53  ( mNext==ALLBITS
1d410 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1d420 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74  if( mNext==mBest
1d430 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74   || mNext==mBest
1d440 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NoIn ) continue;
1d450 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1d460 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1d470 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30  ualOne: mPrev=%0
1d480 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c  4llx mNext=%04ll
1d490 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1d4b0 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72  lite3_uint64)mPr
1d4c0 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  ev, (sqlite3_uin
1d4d0 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20  t64)mNext));.   
1d4e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1d4f0 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1d500 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1d510 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65  er, mPrereq, mNe
1d520 78 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70  xt|mPrereq, 0, p
1d530 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d540 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
1d550 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65  ->prereq==mPrere
1d560 71 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  q ){.        see
1d570 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  nZero = 1;.     
1d580 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20     if( bIn==0 ) 
1d590 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1d5a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d5b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
1d5c0 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1d5d0 65 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76  ex() in the abov
1d5e0 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66  e loop did not f
1d5f0 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a  ind a plan.    *
1d600 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  * that requires 
1d610 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  no source tables
1d620 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e   at all (i.e. on
1d630 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1d640 62 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  be.    ** usable
1d650 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68  ), make a call h
1d660 65 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75  ere with all sou
1d670 72 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62  rce tables disab
1d680 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  led */.    if( r
1d690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d6a0 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20  seenZero==0 ){. 
1d6b0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1d6c0 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1d6d0 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c  lOne: all disabl
1d6e0 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  ed\n"));.      r
1d6f0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1d700 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1d710 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1d720 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71  mPrereq, mPrereq
1d730 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  , 0, p, mNoOmit,
1d740 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1d750 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a  ( bIn==0 ) seenZ
1d760 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1d770 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d780 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1d790 49 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20  Index() have so 
1d7a0 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69  far failed to fi
1d7b0 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1d7c0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1d7d0 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1d7e0 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20  at all and does 
1d7f0 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e  not use an IN(..
1d800 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .).    ** operat
1d810 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c  or, make a final
1d820 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20   call to obtain 
1d830 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  one here.  */.  
1d840 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d850 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e  _OK && seenZeroN
1d860 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIN==0 ){.      
1d870 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1d880 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1d890 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e   all disabled an
1d8a0 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20  d w/o IN\n"));. 
1d8b0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1d8c0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1d8d0 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1d8e0 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1d8f0 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70  Prereq, WO_IN, p
1d900 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1d920 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  f( p->needToFree
1d930 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
1d940 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29  _free(p->idxStr)
1d950 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d960 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eNN(pParse->db, 
1d970 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d980 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1d990 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d9a0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
1d9b0 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
1d9c0 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
1d9d0 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
1d9e0 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
1d9f0 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
1da00 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
1da10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1da20 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68  eLoopAddOr(.  Wh
1da30 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1da40 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74  pBuilder, .  Bit
1da50 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20  mask mPrereq, . 
1da60 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1da70 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  le.){.  WhereInf
1da80 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1da90 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1daa0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1dab0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1dac0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
1dad0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
1dae0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1daf0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
1db00 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
1db10 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
1db20 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
1db30 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
1db40 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
1db50 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1db60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1db70 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
1db80 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
1db90 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
1dba0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
1dbb0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1dbc0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
1dbd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
1dbe0 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
1dbf0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1dc00 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
1dc10 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
1dc20 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
1dc30 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
1dc40 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
1dc50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
1dc60 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
1dc70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1dc80 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
1dc90 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
1dca0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
1dcb0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
1dcc0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
1dcd0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1dce0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
1dcf0 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1dd00 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
1dd10 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
1dd20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
1dd30 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
1dd40 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
1dd50 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
1dd60 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1dd70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
1dd80 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
1dd90 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
1dda0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
1ddb0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
1ddc0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1ddd0 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
1dde0 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
1ddf0 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
1de00 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
1de10 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1de20 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
1de30 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
1de40 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
1de50 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
1de60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
1de70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1de80 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1de90 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
1dea0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
1deb0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
1dec0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
1ded0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
1dee0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1def0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
1df00 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
1df10 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
1df20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
1df30 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
1df40 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
1df50 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
1df60 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
1df70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
1df80 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
1df90 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
1dfa0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
1dfb0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
1dfc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1dfd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1dfe0 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
1dff0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
1e000 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1e010 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
1e020 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
1e030 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
1e040 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
1e050 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
1e060 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
1e070 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
1e080 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
1e090 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
1e0a0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1e0b0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
1e0c0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
1e0d0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
1e0e0 61 75 73 65 50 72 69 6e 74 28 73 53 75 62 42 75  ausePrint(sSubBu
1e0f0 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  ild.pWC);.      
1e100 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1e110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1e120 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1e130 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1e140 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1e150 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e160 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1e170 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
1e180 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1e190 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ble);.        }e
1e1a0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1e1b0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
1e1c0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e1d0 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
1e1e0 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20  , mPrereq);.    
1e1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1e200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e220 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1e230 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1e240 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1e250 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e260 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1e270 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
1e280 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
1e290 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
1e2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1e2b0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1e2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e2d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
1e2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
1e2f0 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
1e300 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
1e310 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1e320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e330 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
1e340 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
1e350 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1e360 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
1e370 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1e380 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
1e390 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
1e3a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e3b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
1e3c0 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
1e3d0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
1e3e0 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
1e3f0 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
1e400 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
1e410 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1e440 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
1e450 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
1e460 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1e490 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
1e4a0 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
1e4b0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
1e4c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1e4d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e4e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
1e4f0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
1e500 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1e510 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
1e520 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1e530 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
1e540 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1e550 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
1e560 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1e570 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
1e580 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
1e590 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
1e5a0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1e5b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
1e5c0 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
1e5d0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
1e5e0 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
1e5f0 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
1e600 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
1e610 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
1e620 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
1e630 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
1e640 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
1e650 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
1e660 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
1e670 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
1e680 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
1e690 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
1e6a0 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
1e6b0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
1e6c0 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
1e6d0 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
1e6e0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
1e6f0 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
1e700 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
1e710 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
1e720 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
1e730 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
1e740 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
1e750 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
1e760 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
1e770 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
1e780 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
1e790 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
1e7a0 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
1e7b0 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
1e7c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1e7d0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
1e7e0 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
1e7f0 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
1e800 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e810 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
1e820 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
1e830 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
1e840 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
1e850 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1e860 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
1e870 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
1e880 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
1e890 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1e8a0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
1e8b0 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
1e8c0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
1e8d0 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
1e8e0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1e8f0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
1e900 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
1e910 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1e920 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1e930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e940 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1e950 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
1e960 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1e970 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1e980 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1e9a0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1e9b0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
1e9c0 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
1e9d0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1e9e0 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
1e9f0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1ea00 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1ea10 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1ea20 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
1ea30 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30  mask mPrereq = 0
1ea40 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1ea50 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1ea60 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1ea70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1ea80 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1ea90 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1eaa0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1eab0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1eac0 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1ead0 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1eae0 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1eaf0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1eb00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1eb10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1eb20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1eb30 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1eb40 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1eb50 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1eb60 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1eb70 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1eb80 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1eb90 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1eba0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1ebb0 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1ebc0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1ebd0 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1ebe0 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1ebf0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1ec00 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1ec10 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1ec20 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1ec30 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1ec40 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1ec50 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1ec60 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1ec70 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1ec80 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1ec90 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1eca0 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1ecb0 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1ecc0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1ecd0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1ece0 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1ecf0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1ed00 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1ed10 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1ed20 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1ed30 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1ed40 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d       mPrereq = m
1ed50 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
1ed60 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1ed70 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
1ed80 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ype;.#ifndef SQL
1ed90 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1eda0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
1edb0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
1edc0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74  Tab) ){.      st
1edd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ede0 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  m *p;.      for(
1edf0 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70  p=&pItem[1]; p<p
1ee00 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
1ee10 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65     if( mUnusable
1ee20 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74   || (p->fg.joint
1ee30 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1ee40 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20  T_CROSS)) ){.   
1ee50 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65         mUnusable
1ee60 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
1ee70 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
1ee80 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43  >sMaskSet, p->iC
1ee90 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
1eea0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1eeb0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1eec0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
1eed0 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  r, mPrereq, mUnu
1eee0 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1eef0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1ef00 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ef10 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  ABLE */.    {.  
1ef20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ef30 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
1ef40 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  der, mPrereq);. 
1ef50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1ef60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ef70 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ef80 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
1ef90 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1efa0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1efb0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1efc0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1efd0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1efe0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1eff0 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1f000 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1f010 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1f020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1f030 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1f040 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1f050 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1f060 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 36  ereLoop of the 6
1f070 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1f080 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1f090 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1f0a0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1f0b0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1f0c0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1f0d0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1f0e0 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1f0f0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1f100 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1f110 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1f120 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1f130 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1f140 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1f150 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1f160 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1f170 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1f180 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1f190 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1f1a0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1f1b0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1f1c0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1f1d0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1f1e0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1f1f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1f200 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1f210 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1f220 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1f230 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1f240 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1f250 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1f260 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1f270 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1f280 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1f290 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1f2a0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1f2b0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1f2c0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1f2d0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1f2e0 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1f2f0 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1f300 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1f310 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1f320 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1f330 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1f340 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1f350 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1f360 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1f370 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1f380 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1f390 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1f3a0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1f3b0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1f3c0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1f3d0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1f3e0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1f3f0 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1f400 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f410 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1f420 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1f430 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1f440 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1f450 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1f460 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1f470 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1f480 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1f490 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1f4a0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1f4b0 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  * WHERE_GROUPBY 
1f4c0 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f  or _DISTINCTBY o
1f4d0 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  r _ORDERBY_LIMIT
1f4e0 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f500 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1f510 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
1f520 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
1f530 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
1f540 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
1f550 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
1f560 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
1f570 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
1f580 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
1f590 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
1f5a0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
1f5b0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1f5c0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
1f5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1f5e0 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
1f5f0 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
1f600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f610 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
1f620 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1f630 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
1f640 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
1f650 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
1f660 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
1f670 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
1f680 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
1f690 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
1f6a0 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
1f6b0 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
1f6c0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
1f6d0 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
1f6e0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
1f6f0 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
1f700 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
1f710 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
1f720 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f730 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f  use */.  u16 eqO
1f740 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f  pMask;         /
1f750 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69  * Allowed equali
1f760 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1f770 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
1f780 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f790 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
1f7a0 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
1f7b0 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
1f7c0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1f7d0 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
1f7e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1f7f0 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
1f800 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1f810 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
1f820 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1f830 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1f840 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
1f850 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
1f860 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
1f870 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
1f880 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1f8b0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1f8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f8d0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
1f8e0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f8f0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1f900 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1f910 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
1f920 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
1f930 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f940 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
1f950 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f960 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
1f970 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1f980 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
1f990 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1f9a0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1f9b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
1f9c0 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
1f9d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
1f9e0 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
1f9f0 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
1fa00 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1fa10 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
1fa20 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
1fa30 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1fa40 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
1fa50 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
1fa60 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
1fa70 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
1fa80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1fa90 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1faa0 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
1fab0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1fac0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
1fad0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
1fae0 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
1faf0 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
1fb00 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
1fb10 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
1fb20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
1fb30 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
1fb40 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
1fb50 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
1fb60 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
1fb70 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
1fb80 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
1fb90 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
1fba0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
1fbb0 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
1fbc0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
1fbd0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
1fbe0 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
1fbf0 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
1fc00 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
1fc10 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
1fc20 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
1fc30 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
1fc40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1fc50 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
1fc60 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
1fc70 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
1fc80 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
1fc90 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
1fca0 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
1fcb0 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
1fcc0 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
1fcd0 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
1fce0 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
1fcf0 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
1fd00 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
1fd10 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
1fd20 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
1fd30 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
1fd40 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
1fd50 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1fd60 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
1fd70 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
1fd80 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
1fd90 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
1fda0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1fdb0 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
1fdc0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
1fdd0 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
1fde0 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
1fdf0 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
1fe00 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
1fe10 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
1fe20 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
1fe30 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
1fe40 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1fe50 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
1fe60 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1fe70 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
1fe80 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
1fe90 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
1fea0 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
1feb0 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
1fec0 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
1fed0 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
1fee0 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
1fef0 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
1ff00 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
1ff10 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
1ff20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1ff30 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
1ff40 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
1ff50 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
1ff60 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
1ff70 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
1ff80 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
1ff90 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
1ffa0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1ffb0 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
1ffc0 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
1ffd0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
1ffe0 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
1fff0 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
20000 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
20010 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
20020 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
20030 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
20040 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
20050 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
20060 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
20070 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
20080 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
20090 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
200a0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
200b0 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
200c0 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
200d0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
200e0 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
200f0 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
20100 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
20110 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
20120 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
20130 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
20140 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
20150 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
20160 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
20170 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
20180 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
20190 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
201a0 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
201b0 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f  .  eqOpMask = WO
201c0 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f  _EQ | WO_IS | WO
201d0 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77  _ISNULL;.  if( w
201e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
201f0 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
20200 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f  ) eqOpMask |= WO
20210 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  _IN;.  for(iLoop
20220 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
20230 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
20240 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
20250 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
20260 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
20270 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
20280 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
20290 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29  f( iLoop<nLoop )
202a0 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  {.      pLoop = 
202b0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
202c0 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77  op];.      if( w
202d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
202e0 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
202f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f  }else{.      pLo
20310 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  op = pLast;.    
20320 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
20330 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
20340 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
20350 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
20360 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
20370 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
20380 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
20390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
203a0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
203b0 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b 0a 20  e.nIdxCol = 0;. 
203c0 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
203d0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
203e0 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
203f0 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
20400 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
20410 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
20420 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
20430 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
20440 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
20450 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
20460 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
20470 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
20480 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
20490 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
204a0 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
204b0 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
204c0 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
204d0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
204e0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
204f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
20500 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
20510 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
20520 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
20530 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
20540 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
20550 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
20560 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
20570 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
20580 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20590 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
205a0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
205b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
205c0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
205d0 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
205e0 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
205f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
20600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20610 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71        ~ready, eq
20620 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20  OpMask, 0);.    
20630 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
20640 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20650 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
20660 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a  rator==WO_IN ){.
20670 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65          /* IN te
20680 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c  rms are only val
20690 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69  id for sorting i
206a0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c  n the ORDER BY L
206b0 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a  IMIT .        **
206c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61   optimization, a
206d0 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20  nd then only if 
206e0 74 68 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c  they are actuall
206f0 79 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  y used.        *
20700 2a 20 62 79 20 74 68 65 20 71 75 65 72 79 20 70  * by the query p
20710 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  lan */.        a
20720 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
20730 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
20740 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20  Y_LIMIT );.     
20750 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
20760 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
20770 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  Term!=pLoop->aLT
20780 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20  erm[j]; j++){}. 
20790 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c         if( j>=pL
207a0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f  oop->nLTerm ) co
207b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
207c0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
207d0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
207e0 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
207f0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
20800 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
20810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
20820 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
20830 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
20840 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
20850 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
20860 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20870 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
20880 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
20890 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
208a0 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
208b0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
208c0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
208d0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
208e0 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
208f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20900 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
20910 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
20920 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
20930 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
20940 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20950 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
20960 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
20970 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20980 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
20990 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
209a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
209b0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
209c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
209d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
209e0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
209f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
20a00 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20a10 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
20a20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
20a30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
20a40 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
20a50 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
20a60 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
20a70 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
20a80 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
20a90 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
20aa0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
20ab0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
20ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20ad0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
20ae0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
20af0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
20b00 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
20b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
20b20 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
20b30 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20b40 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
20b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20b60 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20b70 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e  n[nColumn-1]==XN
20b80 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20bb0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
20bc0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
20bd0 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
20be0 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
20bf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20c00 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
20c10 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
20c20 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
20c30 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
20c40 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
20c50 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
20c60 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
20c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
20c80 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
20c90 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
20ca0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
20cb0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
20cc0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
20cd0 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b     u8 bOnce = 1;
20ce0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
20cf0 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
20d00 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
20d10 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d       assert( j>=
20d20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
20d30 45 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Eq .            
20d40 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  || (pLoop->aLTer
20d50 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f  m[j]==0)==(j<pLo
20d60 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20  op->nSkip).     
20d70 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
20d80 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
20d90 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f  ee.nEq && j>=pLo
20da0 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  op->nSkip ){.   
20db0 20 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d         u16 eOp =
20dc0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
20dd0 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20  ]->eOperator;.. 
20de0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
20df0 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
20e00 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73  and ISNULL terms
20e10 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e  .  (Also skip IN
20e20 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20   terms when.    
20e30 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57        ** doing W
20e40 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
20e50 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20  IT processing). 
20e60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
20e70 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
20e80 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
20e90 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  s a column of an
20ea0 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45   ((?,?) IN (SELE
20eb0 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20  CT...)) .       
20ec0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
20ed0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53   for which the S
20ee0 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f  ELECT returns mo
20ef0 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
20f00 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mn,.          **
20f10 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
20f20 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d  s the only colum
20f30 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c  n used by this l
20f40 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  oop. Otherwise,.
20f50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
20f60 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f  it is one of two
20f70 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f   or more, none o
20f80 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61  f the columns ca
20f90 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  n be.          *
20fa0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
20fb0 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42  match an ORDER B
20fc0 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  Y term.  */.    
20fd0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
20fe0 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b   eqOpMask)!=0 ){
20ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21000 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
21010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21020 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
21030 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
21050 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
21060 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21070 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
21080 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
21090 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
210a0 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  YS(eOp & WO_IN) 
210b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
210c0 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69  * ALWAYS() justi
210d0 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73  fication: eOp is
210e0 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65   an equality ope
210f0 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65  rator due to the
21100 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21110 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
21120 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20  .nEq constraint 
21130 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61  above.  Any equa
21140 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20  lity other.     
21150 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57         ** than W
21160 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64  O_IN is captured
21170 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
21180 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20   "if".  So this 
21190 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
211a0 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f  ** always has to
211b0 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20   be WO_IN. */.  
211c0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
211d0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
211e0 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20  rm[j]->pExpr;.  
211f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
21200 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e  j+1; i<pLoop->u.
21210 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b  btree.nEq; i++){
21220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21230 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  f( pLoop->aLTerm
21240 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29  [i]->pExpr==pX )
21250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21260 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
21270 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70  ->aLTerm[i]->eOp
21280 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20  erator & WO_IN) 
21290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
212a0 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20     bOnce = 0;.  
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
212c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
212d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
212e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
212f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21300 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
21310 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
21320 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
21330 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
21340 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
21350 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
21360 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
21370 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
21380 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
21390 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
213a0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
213b0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
213c0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
213d0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
213e0 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
213f0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
21400 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
21410 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
21420 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
21430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21440 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f   iColumn = XN_RO
21450 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72  WID;.          r
21460 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
21470 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
21480 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
21490 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
214a0 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
214b0 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
214c0 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
214d0 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
214e0 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
214f0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
21500 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
21510 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
21520 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
21530 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
21540 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
21550 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
21560 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
21570 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
21580 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
21590 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
215a0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
215b0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
215c0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
215d0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
215e0 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
215f0 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
21600 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
21610 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
21620 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
21630 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21640 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
21650 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
21660 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
21670 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
21680 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
21690 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
216a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
216b0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
216c0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
216d0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
216e0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
216f0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
21700 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21710 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
21720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
21730 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21740 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
21750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
21760 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
21770 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
21780 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
21790 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
217a0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
217b0 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20  umn>=(-1) ){.   
217c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
217d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
217e0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
217f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21800 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
21810 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
21820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21830 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
21840 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
21850 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21870 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21880 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20  ExprCompare(0,. 
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 70 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d   pOBExpr,pIndex-
218b0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
218c0 70 45 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20  pExpr,iCur) ){. 
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
218e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
218f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
21900 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21910 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44  Column!=XN_ROWID
21920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21930 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
21940 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
21950 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
21960 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
21970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21980 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
21990 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
219a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
219b0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
219c0 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
219d0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
219e0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
219f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21a00 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
21a10 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20  btree.nIdxCol = 
21a20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  j+1;.          i
21a30 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
21a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21a60 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
21a70 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21a80 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
21a90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
21aa0 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
21ab0 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
21ac0 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
21ad0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
21ae0 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
21af0 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
21b00 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
21b10 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
21b20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
21b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21b40 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
21b50 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
21b60 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
21b70 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
21b80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21b90 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
21ba0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
21bb0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
21bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21bd0 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
21be0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
21bf0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
21c00 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
21c10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21c20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
21c30 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
21c40 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
21c50 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  =XN_ROWID ){.   
21c60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21c70 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  e( distinctColum
21c80 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ns==0 );.       
21c90 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
21ca0 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  umns = 1;.      
21cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21cc0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
21cd0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  (i);.        }el
21ce0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
21cf0 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20   No match found 
21d00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
21d10 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43   j==0 || j<nKeyC
21d20 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
21d30 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
21d40 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29  derDistinct!=0 )
21d50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
21d60 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
21d70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
21d80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21da0 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76  } /* end Loop ov
21db0 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  er all index col
21dc0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  umns */.      if
21dd0 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
21de0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  s ){.        tes
21df0 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
21e00 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
21e10 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
21e20 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  inct = 1;.      
21e30 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69  }.    } /* end-i
21e40 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f  f not one-row */
21e50 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
21e60 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45  f any other ORDE
21e70 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
21e80 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20  reference pLoop 
21e90 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64  */.    if( isOrd
21ea0 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
21eb0 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63      orderDistinc
21ec0 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  tMask |= pLoop->
21ed0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
21ee0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
21ef0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
21f00 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
21f10 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72      Bitmask mTer
21f20 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  m;.        if( M
21f30 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
21f40 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
21f50 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72        p = pOrder
21f60 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
21f70 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20          mTerm = 
21f80 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
21f90 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73  Usage(&pWInfo->s
21fa0 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20  MaskSet,p);.    
21fb0 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30      if( mTerm==0
21fc0 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
21fd0 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20  IsConstant(p) ) 
21fe0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21ff0 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72    if( (mTerm&~or
22000 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
22010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22020 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
22030 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
22040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22050 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f  } /* End the loo
22060 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65  p over all Where
22070 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72  Loops from outer
22080 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e  -most down to in
22090 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66  ner-most */.  if
220a0 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
220b0 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72  ) return (i8)nOr
220c0 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73  derBy;.  if( !is
220d0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
220e0 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65  .    for(i=nOrde
220f0 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  rBy-1; i>0; i--)
22100 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
22110 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d  m = MASKBIT(i) -
22120 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f   1;.      if( (o
22130 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74  bSat&m)==m ) ret
22140 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  urn i;.    }.   
22150 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
22160 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a   return -1;.}...
22170 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  /*.** If the WHE
22180 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
22190 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61  is set in the ma
221a0 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  sk passed to sql
221b0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
221c0 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72  ,.** the planner
221d0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
221e0 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64  e specified pOrd
221f0 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74  erBy list is act
22200 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a  ually a GROUP.**
22210 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64   BY clause - and
22220 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68   so any order th
22230 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61  at groups rows a
22240 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73  s required satis
22250 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75  fies the.** requ
22260 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  est..**.** Norma
22270 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73  lly, in this cas
22280 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
22290 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c  ible for the cal
222a0 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ler to determine
222b0 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
222c0 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20  ot the rows are 
222d0 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c  really being del
222e0 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64  ivered in sorted
222f0 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75   order, or.** ju
22300 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  st in some other
22310 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76   order that prov
22320 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ides the require
22330 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65  d grouping. Howe
22340 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57  ver,.** if the W
22350 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
22360 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61   flag is also pa
22370 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
22380 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65  hereBegin(), the
22390 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
223a0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
223b0 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
223c0 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63   WhereInfo objec
223d0 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  t. It returns.**
223e0 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
223f0 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65  s really will be
22400 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73   sorted in the s
22410 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20  pecified order, 
22420 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65  or false.** othe
22430 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rwise..**.** For
22440 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
22450 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
22460 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
22470 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74  1(x, Y);.**.** t
22480 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  hen.**.**   SELE
22490 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
224a0 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20  UP BY x,y ORDER 
224b0 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53  BY x,y;   -- IsS
224c0 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20  orted()==1.**   
224d0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
224e0 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52   GROUP BY y,x OR
224f0 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d  DER BY y,x;   --
22500 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a   IsSorted()==0.*
22510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
22520 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65  reIsSorted(Where
22530 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
22540 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
22550 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
22560 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
22570 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
22580 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
22590 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
225a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
225b0 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23  fo->sorted;.}..#
225c0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
225d0 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
225e0 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
225f0 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
22600 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
22610 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
22620 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
22630 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
22640 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
22650 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
22660 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
22670 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
22680 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
22690 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
226a0 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
226b0 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
226c0 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
226d0 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
226e0 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
226f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22700 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  turn the cost of
22710 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f   sorting nRow ro
22720 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ws, assuming tha
22730 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20  t the keys have 
22740 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c  .** nOrderby col
22750 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68  umns and that th
22760 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20  e first nSorted 
22770 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65  columns are alre
22780 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e  ady in.** order.
22790 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
227a0 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  t whereSortingCo
227b0 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  st(.  WhereInfo 
227c0 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73  *pWInfo,.  LogEs
227d0 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f  t nRow,.  int nO
227e0 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53  rderBy,.  int nS
227f0 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55  orted.){.  /* TU
22800 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
22810 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65  cost of a full e
22820 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68  xternal sort, wh
22830 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74  ere N is .  ** t
22840 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
22850 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20  s to sort is:.  
22860 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
22870 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
22880 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  N))..  ** .  ** 
22890 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72  Or, if the order
228a0 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58  -by clause has X
228b0 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20   terms but only 
228c0 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a  the last Y .  **
228d0 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f   terms are out o
228e0 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c  f order, then bl
228f0 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c  ock-sorting will
22900 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a   reduce the .  *
22910 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74  * sorting cost t
22920 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63  o:.  **.  **   c
22930 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
22940 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29   log(N)) * (Y/X)
22950 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28  .  **.  ** The (
22960 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70  Y/X) term is imp
22970 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73  lemented using s
22980 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53  tack variable rS
22990 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e  cale.  ** below.
229a0 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53    */.  LogEst rS
229b0 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b  cale, rSortCost;
229c0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65  .  assert( nOrde
229d0 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c  rBy>0 && 66==sql
229e0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
229f0 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71  );.  rScale = sq
22a00 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72  lite3LogEst((nOr
22a10 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31  derBy-nSorted)*1
22a20 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36  00/nOrderBy) - 6
22a30 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d  6;.  rSortCost =
22a40 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b   nRow + rScale +
22a50 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69   16;..  /* Multi
22a60 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68  ple by log(M) wh
22a70 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d  ere M is the num
22a80 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
22a90 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65  ws..  ** Use the
22aa0 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20   LIMIT for M if 
22ab0 69 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f  it is smaller */
22ac0 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
22ad0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22ae0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30  RE_USE_LIMIT)!=0
22af0 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d   && pWInfo->iLim
22b00 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e  it<nRow ){.    n
22b10 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c  Row = pWInfo->iL
22b20 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72  imit;.  }.  rSor
22b30 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28  tCost += estLog(
22b40 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  nRow);.  return 
22b50 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a  rSortCost;.}../*
22b60 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
22b70 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
22b80 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
22b90 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
22ba0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
22bb0 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
22bc0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
22bd0 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
22be0 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
22bf0 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
22c00 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
22c10 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
22c20 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
22c30 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
22c40 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
22c50 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
22c60 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
22c70 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
22c80 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
22c90 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
22ca0 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
22cb0 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
22cc0 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
22cd0 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
22ce0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
22cf0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
22d00 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
22d10 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
22d20 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
22d30 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
22d40 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
22d50 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
22d60 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
22d70 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
22d80 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
22d90 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
22da0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
22db0 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
22dc0 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
22dd0 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
22de0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22df0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
22e00 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
22e10 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
22e20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
22e30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
22e40 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
22e50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
22e60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22e70 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
22e80 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
22e90 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22ea0 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
22eb0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
22ec0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22ee0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
22ef0 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22f10 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
22f20 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
22f30 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f50 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
22f60 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
22f70 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
22f80 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
22f90 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
22fa0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
22fb0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55   */.  LogEst mxU
22fc0 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20  nsorted = 0;    
22fd0 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72  /* Maximum unsor
22fe0 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65  ted cost of a se
22ff0 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69  t of path */.  i
23000 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
23010 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23020 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
23030 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
23040 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
23050 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
23060 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
23070 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
23080 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
23090 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
230a0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
230b0 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
230c0 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
230d0 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
230e0 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
230f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
23100 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
23110 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
23120 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
23130 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
23140 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
23150 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
23160 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
23170 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
23180 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
23190 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
231a0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
231b0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
231c0 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
231d0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
231e0 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
231f0 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c  ce memory */.  L
23200 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74  ogEst *aSortCost
23210 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74   = 0;    /* Sort
23220 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20  ing and partial 
23230 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f  sorting costs */
23240 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23260 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
23270 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
23280 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  utine */.  int n
23290 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
232a0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
232b0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
232c0 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20   at pSpace */.. 
232d0 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
232e0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
232f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
23300 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
23310 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
23320 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
23330 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
23340 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
23350 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
23360 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
23370 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
23380 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
23390 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
233a0 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
233b0 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
233c0 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
233d0 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
233e0 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
233f0 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
23400 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
23410 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
23420 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
23430 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
23440 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
23450 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c  .  (nRowEst=%d)\
23460 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a  n", nRowEst));..
23470 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20    /* If nRowEst 
23480 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72  is zero and ther
23490 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
234a0 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20   clause, ignore 
234b0 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a  it. In this.  **
234c0 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73   case the purpos
234d0 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
234e0 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  s to estimate th
234f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
23500 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62   returned.  ** b
23510 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  y the overall qu
23520 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65  ery. Once this e
23530 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e  stimate has been
23540 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63   obtained, the c
23550 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20  aller.  ** will 
23560 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
23570 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69  tion a second ti
23580 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20  me, passing the 
23590 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a  estimate as the.
235a0 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72    ** nRowEst par
235b0 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66  ameter.  */.  if
235c0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
235d0 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
235e0 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65  ==0 ){.    nOrde
235f0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
23600 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
23610 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
23620 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
23630 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
23640 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
23650 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d  e for aTo, aFrom
23660 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d   and aSortCost[]
23670 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28   */.  nSpace = (
23680 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
23690 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
236a0 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
236b0 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65  oice*2;.  nSpace
236c0 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
236d0 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  t) * nOrderBy;. 
236e0 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
236f0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
23700 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66  b, nSpace);.  if
23710 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
23720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23730 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20  M_BKPT;.  aTo = 
23740 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61  (WherePath*)pSpa
23750 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54  ce;.  aFrom = aT
23760 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65  o+mxChoice;.  me
23770 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73  mset(aFrom, 0, s
23780 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29  izeof(aFrom[0]))
23790 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c  ;.  pX = (WhereL
237a0 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43  oop**)(aFrom+mxC
237b0 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69  hoice);.  for(ii
237c0 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72  =mxChoice*2, pFr
237d0 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69  om=aTo; ii>0; ii
237e0 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20  --, pFrom++, pX 
237f0 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70  += nLoop){.    p
23800 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58  From->aLoop = pX
23810 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64  ;.  }.  if( nOrd
23820 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
23830 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
23840 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
23850 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  d it is not bein
23860 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75  g ignored, set u
23870 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66  p.    ** space f
23880 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  or the aSortCost
23890 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65  [] array. Each e
238a0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53  lement of the aS
238b0 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20  ortCost array.  
238c0 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a    ** is either z
238d0 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74  ero - meaning it
238e0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
238f0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20  n initialized - 
23900 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
23910 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52  st of sorting nR
23920 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61  owEst rows of da
23930 74 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72  ta where the fir
23940 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20  st X terms of.  
23950 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
23960 59 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72  Y clause are alr
23970 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77  eady in order, w
23980 68 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72  here X is the ar
23990 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65  ray .    ** inde
239a0 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74  x.  */.    aSort
239b0 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29  Cost = (LogEst*)
239c0 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61  pX;.    memset(a
239d0 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a  SortCost, 0, siz
239e0 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
239f0 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61  rderBy);.  }.  a
23a00 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74  ssert( aSortCost
23a10 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e  ==0 || &pSpace[n
23a20 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26  Space]==(char*)&
23a30 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72  aSortCost[nOrder
23a40 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  By] );.  assert(
23a50 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c   aSortCost!=0 ||
23a60 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d   &pSpace[nSpace]
23a70 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a  ==(char*)pX );..
23a80 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65    /* Seed the se
23a90 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67  arch with a sing
23aa0 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e  le WherePath con
23ab0 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65  taining zero Whe
23ac0 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20  reLoops..  **.  
23ad0 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f  ** TUNING: Do no
23ae0 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72  t let the number
23af0 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67   of iterations g
23b00 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20  o above 28.  If 
23b10 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66  the cost.  ** of
23b20 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75   computing an au
23b30 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
23b40 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77   not paid back w
23b50 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
23b60 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  28.  ** rows, th
23b70 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  en do not use th
23b80 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
23b90 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d  x. */.  aFrom[0]
23ba0 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72  .nRow = MIN(pPar
23bb0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20  se->nQueryLoop, 
23bc0 34 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38  48);  assert( 48
23bd0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
23be0 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d  28) );.  nFrom =
23bf0 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46   1;.  assert( aF
23c00 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
23c10 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  ==0 );.  if( nOr
23c20 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20  derBy ){.    /* 
23c30 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f  If nLoop is zero
23c40 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65  , then there are
23c50 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69   no FROM terms i
23c60 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e  n the query. Sin
23c70 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ce.    ** in thi
23c80 73 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79  s case the query
23c90 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61   may return a ma
23ca0 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77  ximum of one row
23cb0 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  , the results.  
23cc0 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79    ** are already
23cd0 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
23ce0 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f  d order. Set isO
23cf0 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72  rdered to nOrder
23d00 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64  By to.    ** ind
23d10 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20  icate this. Or, 
23d20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61  if nLoop is grea
23d30 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73  ter than zero, s
23d40 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a  et isOrdered to.
23d50 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63      ** -1, indic
23d60 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72  ating that the r
23d70 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72  esult set may or
23d80 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65   may not be orde
23d90 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70  red, .    ** dep
23da0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f  ending on the lo
23db0 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  ops added to the
23dc0 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20   current plan.  
23dd0 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e  */.    aFrom[0].
23de0 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f  isOrdered = nLoo
23df0 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65  p>0 ? -1 : nOrde
23e00 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  rBy;.  }..  /* C
23e10 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76  ompute successiv
23e20 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65  ely longer Where
23e30 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20  Paths using the 
23e40 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74  previous generat
23e50 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72  ion.  ** of Wher
23e60 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61  ePaths as the ba
23e70 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sis for the next
23e80 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
23e90 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
23ea0 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74  ** best paths at
23eb0 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e   each generation
23ec0 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
23ed0 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
23ee0 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54  iLoop++){.    nT
23ef0 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
23f00 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d  i=0, pFrom=aFrom
23f10 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
23f20 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
23f30 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49    for(pWLoop=pWI
23f40 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c  nfo->pLoops; pWL
23f50 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f  oop; pWLoop=pWLo
23f60 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  op->pNextLoop){.
23f70 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e          LogEst n
23f80 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
23f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
23fa0 73 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46  s visited by (pF
23fb0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
23fc0 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43         LogEst rC
23fd0 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
23fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
23ff0 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b   of path (pFrom+
24000 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
24010 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72     LogEst rUnsor
24020 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
24030 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64       /* Unsorted
24040 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b   cost of (pFrom+
24050 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
24060 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20     i8 isOrdered 
24070 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
24080 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65  ed;  /* isOrdere
24090 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c  d for (pFrom+pWL
240a0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
240b0 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63    /* Mask of src
240e0 20 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29   visited by (..)
240f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
24100 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24120 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64   Mask of rev-ord
24130 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e  er loops for (..
24140 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66  ) */..        if
24150 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65  ( (pWLoop->prere
24160 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b  q & ~pFrom->mask
24170 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
24180 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
24190 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   (pWLoop->maskSe
241a0 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  lf & pFrom->mask
241b0 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
241c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
241d0 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   (pWLoop->wsFlag
241e0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
241f0 4e 44 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f  NDEX)!=0 && pFro
24200 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20  m->nRow<10 ){.  
24210 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
24220 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74  t use an automat
24230 69 63 20 69 6e 64 65 78 20 69 66 20 74 68 65 20  ic index if the 
24240 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70  this loop is exp
24250 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  ected.          
24260 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74  ** to run less t
24270 68 61 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a  han 2 times. */.
24280 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24290 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
242a0 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  Est(2) );.      
242b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
242c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
242d0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
242e0 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
242f0 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
24300 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
24310 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
24320 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
24330 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
24340 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
24350 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
24360 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
24370 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
24380 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
24390 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
243a0 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46  dd(rUnsorted, pF
243b0 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b  rom->rUnsorted);
243c0 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
243d0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
243e0 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
243f0 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
24400 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
24410 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
24420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
24430 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20  Ordered<0 ){.   
24440 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
24450 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
24460 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
24470 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
24480 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
24490 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
244a0 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
244b0 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244d0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
244e0 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  revMask);.      
244f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24500 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72     revMask = pFr
24510 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
24520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
24530 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  f( isOrdered>=0 
24540 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72  && isOrdered<nOr
24550 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
24560 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74     if( aSortCost
24570 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29  [isOrdered]==0 )
24580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  {.            aS
24590 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
245a0 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e  d] = whereSortin
245b0 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20  gCost(.         
245c0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e         pWInfo, n
245d0 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79  RowEst, nOrderBy
245e0 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  , isOrdered.    
245f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
24600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24610 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
24620 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
24630 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69  ted, aSortCost[i
24640 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20  sOrdered]);..   
24650 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
24660 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20  E(0x002,.       
24670 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f         ("---- so
24680 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64  rt cost=%-3d (%d
24690 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63  /%d) increases c
246a0 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c  ost %3d to %-3d\
246b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
246c0 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
246d0 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72  rdered], (nOrder
246e0 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e  By-isOrdered), n
246f0 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
24700 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74           rUnsort
24710 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20  ed, rCost));.   
24720 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24730 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55        rCost = rU
24740 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
24750 20 20 20 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20     rUnsorted -= 
24760 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20  2;  /* TUNING:  
24770 53 6c 69 67 68 74 20 62 69 61 73 20 69 6e 20 66  Slight bias in f
24780 61 76 6f 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20  avor of no-sort 
24790 70 6c 61 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  plans */.       
247a0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
247b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
247c0 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
247d0 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
247e0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d   of.        ** m
247f0 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d  xChoice best-so-
24800 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20  far paths..     
24810 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
24820 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20   First look for 
24830 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  an existing path
24840 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66   among best-so-f
24850 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20  ar paths.       
24860 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20   ** that covers 
24870 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
24880 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
24890 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64  e same isOrdered
248a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74  .        ** sett
248b0 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65  ing as the curre
248c0 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74  nt path candidat
248d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
248e0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72        ** The ter
248f0 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  m "((pTo->isOrde
24900 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
24910 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69  x80)==0" is equi
24920 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  valent.        *
24930 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  * to (pTo->isOrd
24940 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73  ered==(-1))==(is
24950 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20  Ordered==(-1))" 
24960 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20  for the range.  
24970 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61        ** of lega
24980 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f  l values for isO
24990 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a  rdered, -1..64..
249a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
249b0 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f     for(jj=0, pTo
249c0 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a  =aTo; jj<nTo; jj
249d0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
249e0 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d        if( pTo->m
249f0 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77  askLoop==maskNew
24a00 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
24a10 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
24a20 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
24a30 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ==0.          ){
24a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
24a50 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31  tcase( jj==nTo-1
24a60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24a70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
24a80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24a90 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
24aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
24ab0 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69   None of the exi
24ac0 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  sting best-so-fa
24ad0 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68  r paths match th
24ae0 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
24af0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
24b00 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  o>=mxChoice.    
24b10 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74         && (rCost
24b20 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73  >mxCost || (rCos
24b30 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e  t==mxCost && rUn
24b40 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74  sorted>=mxUnsort
24b50 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  ed)).          )
24b60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
24b70 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e   The current can
24b80 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74  didate is no bet
24b90 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20  ter than any of 
24ba0 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20  the mxChoice.   
24bb0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68           ** path
24bc0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
24bd0 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62  he best-so-far b
24be0 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61  uffer.  So disca
24bf0 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  rd.            *
24c00 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65  * this candidate
24c10 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20   as not viable. 
24c20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
24c30 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
24c40 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
24c50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
24c60 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
24c80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24c90 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
24ca0 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
24cb0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24cd0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
24ce0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
24cf0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72  , rCost, nOut, r
24d00 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20  Unsorted,.      
24d10 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
24d20 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
24d30 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
24d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
24d50 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
24d60 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24d80 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
24d90 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
24da0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
24db0 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
24dc0 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
24dd0 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
24de0 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
24df0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
24e00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
24e10 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
24e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
24e30 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
24e40 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
24e50 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
24e60 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
24e70 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
24e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24e90 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
24ea0 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
24eb0 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
24ec0 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
24ed0 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
24ee0 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
24ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f00 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
24f10 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
24f20 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
24f30 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
24f40 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
24f50 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
24f60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24f70 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
24f80 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
24f90 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
24fa0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
24fb0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
24fc0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
24fd0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
24fe0 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74  t, nOut, rUnsort
24ff0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
25000 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
25010 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
25020 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
25030 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25050 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
25060 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
25070 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
25080 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76   pTo=aTo[jj] cov
25090 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ers the.        
250a0 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66    ** same set of
250b0 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
250c0 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65  he same isOrdere
250d0 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
250e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
250f0 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
25100 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
25110 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
25120 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
25130 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
25140 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
25150 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
25160 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ed..          **
25170 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54   .          ** T
25180 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69  he conditional i
25190 73 20 61 6e 20 65 78 70 61 6e 64 65 64 20 76 65  s an expanded ve
251a0 63 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ctor comparison 
251b0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
251c0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 70           **   (p
251d0 54 6f 2d 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e  To->rCost,pTo->n
251e0 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74  Row,pTo->rUnsort
251f0 65 64 29 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f  ed) <= (rCost,nO
25200 75 74 2c 72 55 6e 73 6f 72 74 65 64 29 0a 20 20  ut,rUnsorted).  
25210 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25220 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
25230 6f 73 74 3c 72 43 6f 73 74 20 0a 20 20 20 20 20  ost<rCost .     
25240 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
25250 43 6f 73 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20  Cost==rCost.    
25260 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
25270 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20  To->nRow<nOut.  
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25290 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d   || (pTo->nRow==
252a0 6e 4f 75 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  nOut && pTo->rUn
252b0 73 6f 72 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65  sorted<=rUnsorte
252c0 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d).             
252d0 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
252e0 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
252f0 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
25300 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
25310 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
25320 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25330 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
25340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
25350 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25360 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
25370 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
25380 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
25390 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
253b0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
253c0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
253d0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
253e0 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20   rUnsorted,.    
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25400 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
25410 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
25420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
25430 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25440 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
25450 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20  st=%-3d,%3d,%3d 
25460 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25480 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
25490 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
254a0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
254b0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
254c0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e          pTo->rUn
254d0 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f  sorted, pTo->isO
254e0 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
254f0 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
25500 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
25510 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25520 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61          /* Disca
25530 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  rd the candidate
25540 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68   path from furth
25550 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
25560 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25570 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
25580 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
25590 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
255a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
255b0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
255c0 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
255d0 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
255e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
255f0 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
25600 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
25610 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68  ath is better th
25620 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  an the.         
25630 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52   ** pTo path.  R
25640 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20  eplace pTo with 
25650 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a  the candidate. *
25660 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
25670 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
25680 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
25690 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
256a0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
256b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
256c0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
256e0 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
256f0 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
25700 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
25710 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
25720 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
25730 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
25740 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64   nOut, rUnsorted
25750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25760 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
25770 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
25780 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
25790 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
257a0 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
257b0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
257c0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
257e0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
257f0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
25800 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
25810 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
25820 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f        pTo->rUnso
25830 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64  rted, pTo->isOrd
25840 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
25850 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
25860 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
25870 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
25880 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
25890 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
258a0 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
258b0 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
258c0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
258d0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
258e0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
258f0 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
25900 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
25910 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
25920 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
25930 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
25940 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
25950 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
25960 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d  pTo->rUnsorted =
25970 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
25980 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
25990 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
259a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
259b0 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
259c0 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
259d0 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
259e0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
259f0 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
25a00 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
25a10 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
25a20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
25a30 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
25a40 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
25a50 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
25a60 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
25a70 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
25a80 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
25a90 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
25aa0 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
25ab0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
25ac0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
25ad0 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20  ost>mxCost .    
25ae0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
25af0 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
25b00 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
25b10 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20  d>mxUnsorted) . 
25b20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
25b30 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
25b40 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
25b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
25b60 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d  xUnsorted = pTo-
25b70 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20  >rUnsorted;.    
25b80 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
25b90 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
25ba0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
25bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25bc0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
25bd0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25be0 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
25bf0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25c00 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a  Trace & 0x02 ){.
25c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25c20 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
25c30 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
25c40 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
25c50 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
25c60 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
25c70 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
25c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25c90 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
25ca0 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
25cb0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
25cc0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
25cd0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
25ce0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
25cf0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
25d00 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
25d10 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70  sOrdered>=0 ? (p
25d20 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
25d30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
25d40 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
25d50 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  dered>0 ){.     
25d60 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25d70 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
25d80 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
25d90 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
25da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25db0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25dc0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
25dd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25de0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
25df0 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
25e00 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
25e10 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
25e20 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
25e30 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
25e40 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
25e50 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
25e60 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
25e70 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
25e80 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
25e90 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25ea0 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
25eb0 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
25ec0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
25ed0 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
25ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25ef0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
25f00 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
25f10 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
25f20 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
25f30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
25f40 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
25f50 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
25f60 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
25f70 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
25f80 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
25f90 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
25fa0 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
25fb0 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
25fc0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
25fd0 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
25fe0 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
25ff0 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
26000 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
26010 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
26020 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
26030 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
26040 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
26050 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
26060 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
26070 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
26080 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
26090 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
260a0 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
260b0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
260c0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
260d0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
260e0 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
260f0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
26100 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
26110 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
26120 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
26130 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
26140 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
26150 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
26160 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
26170 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
26180 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
26190 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
261a0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
261b0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
261c0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
261d0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
261e0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
261f0 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
26200 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
26210 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
26220 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
26230 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
26240 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
26250 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  c==pWInfo->pResu
26260 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  ltSet->nExpr ){.
26270 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
26280 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
26290 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
262a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
262b0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
262c0 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57  By ){.    if( pW
262d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
262e0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
262f0 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28  TBY ){.      if(
26300 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
26310 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  d==pWInfo->pOrde
26320 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
26330 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
26340 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
26350 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
26360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
26370 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  lse{.      pWInf
26380 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f  o->nOBSat = pFro
26390 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  m->isOrdered;.  
263a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
263b0 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
263c0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  Loop;.      if( 
263d0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d  pWInfo->nOBSat<=
263e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  0 ){.        pWI
263f0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
26400 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f  .        if( nLo
26410 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  op>0 ){.        
26420 20 20 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20    u32 wsFlags = 
26430 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
26440 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a  op-1]->wsFlags;.
26450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
26460 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
26470 4e 45 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20  NEROW)==0 .     
26480 20 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67        && (wsFlag
26490 73 26 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  s&(WHERE_IPK|WHE
264a0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d  RE_COLUMN_IN))!=
264b0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
264c0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20  _COLUMN_IN).    
264d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
264e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
264f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
26500 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
26510 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
26520 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
26530 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
26540 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
26550 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
26560 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e  ORDERBY_LIMIT, n
26570 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
26580 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
26590 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
265a0 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
265b0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b  s & WHERE_IPK );
265c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
265d0 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
265e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
265f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
26600 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
26610 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
26620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26630 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65   pWInfo->bOrdere
26640 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a  dInnerLoop = 1;.
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
26660 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
26670 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  m;.            }
26680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
266a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57     }.    if( (pW
266b0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
266c0 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
266d0 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26  ROUP).        &&
266e0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d   pWInfo->nOBSat=
266f0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
26700 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f  y->nExpr && nLoo
26710 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  p>0.    ){.     
26720 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
26730 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
26740 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61  nOrder = wherePa
26750 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
26760 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
26770 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20  o->pOrderBy, .  
26780 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30          pFrom, 0
26790 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
267a0 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
267b0 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20  , &revMask.     
267c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
267d0 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  ( pWInfo->sorted
267e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
267f0 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d   nOrder==pWInfo-
26800 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
26810 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
26820 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a  fo->sorted = 1;.
26830 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
26840 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73  revMask = revMas
26850 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26860 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d  .  }...  pWInfo-
26870 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
26880 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
26890 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
268a0 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
268b0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
268c0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
268d0 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
268e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
268f0 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
26900 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
26910 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
26920 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
26930 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
26940 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
26950 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
26960 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
26970 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
26980 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
26990 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
269a0 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
269b0 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
269c0 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
269d0 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
269e0 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
269f0 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
26a00 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
26a10 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
26a20 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
26a30 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
26a40 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
26a50 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
26a60 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
26a70 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
26a80 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
26a90 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
26aa0 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
26ab0 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
26ac0 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
26ad0 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
26ae0 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
26af0 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
26b00 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
26b10 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
26b20 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
26b30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
26b40 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
26b50 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
26b60 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
26b70 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
26b80 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
26b90 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
26ba0 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
26bb0 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
26bc0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
26bd0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
26be0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26bf0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20  _OR_SUBCLAUSE ) 
26c00 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
26c10 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
26c20 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
26c30 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
26c40 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
26c50 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
26c60 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
26c70 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
26c80 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
26c90 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
26ca0 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dBy ) return 0;.
26cb0 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
26cc0 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
26cd0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
26ce0 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
26cf0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
26d00 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
26d10 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20   pLoop->nSkip = 
26d20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  0;.  pTerm = sql
26d30 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
26d40 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
26d50 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c   0, WO_EQ|WO_IS,
26d60 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
26d70 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
26d80 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
26d90 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
26da0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
26db0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
26dc0 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
26dd0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
26de0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
26df0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
26e00 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
26e10 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
26e20 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
26e30 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
26e40 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
26e50 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
26e60 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
26e70 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33    /* 33==sqlite3
26e80 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20  LogEst(10) */.  
26e90 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
26ea0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
26eb0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
26ec0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
26ed0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20   int opMask;.   
26ee0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
26ef0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70  ->aLTermSpace==p
26f00 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a  Loop->aLTerm );.
26f10 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69        if( !IsUni
26f20 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20  queIndex(pIdx). 
26f30 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
26f40 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
26f50 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
26f60 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
26f70 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
26f80 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
26f90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26fa0 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75  opMask = pIdx->u
26fb0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f  niqNotNull ? (WO
26fc0 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f  _EQ|WO_IS) : WO_
26fd0 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  EQ;.      for(j=
26fe0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
26ff0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
27000 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
27010 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
27020 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20  WC, iCur, j, 0, 
27030 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  opMask, pIdx);. 
27040 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
27050 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
27060 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27070 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27080 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
27090 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
270a0 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
270b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
270c0 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  !=pIdx->nKeyCol 
270d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
270e0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
270f0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
27100 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
27110 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
27120 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69       if( pIdx->i
27130 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49  sCovering || (pI
27140 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
27150 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
27160 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
27170 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
27180 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
27190 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
271a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
271b0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
271c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
271d0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
271e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
271f0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
27200 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
27210 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
27220 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
27230 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
27240 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
27250 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
27260 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
27270 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
27280 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
27290 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
272a0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31  nOut = (LogEst)1
272b0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
272c0 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
272d0 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  p;.    assert( p
272e0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e  WInfo->sMaskSet.
272f0 6e 3d 3d 31 20 26 26 20 69 43 75 72 3d 3d 70 57  n==1 && iCur==pW
27300 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 69  Info->sMaskSet.i
27310 78 5b 30 5d 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  x[0] );.    pLoo
27320 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 31 3b  p->maskSelf = 1;
27330 20 2f 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   /* sqlite3Where
27340 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
27350 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
27360 3b 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ; */.    pWInfo-
27370 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
27380 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
27390 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
273a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
273b0 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
273c0 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e  ->nOBSat =  pWIn
273d0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
273e0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  xpr;.    if( pWI
273f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27400 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
27410 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
27420 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
27430 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
27440 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
27450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
27460 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
27470 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
27480 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
27490 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
274a0 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
274b0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 78 70 72  unction for expr
274c0 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28  IsDeterministic(
274d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
274e0 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72   exprNodeIsDeter
274f0 6d 69 6e 69 73 74 69 63 28 57 61 6c 6b 65 72 20  ministic(Walker 
27500 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
27510 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
27520 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
27530 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50  TION && ExprHasP
27540 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
27550 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3d 3d 30 20  P_ConstFunc)==0 
27560 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
27570 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
27580 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
27590 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
275a0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
275b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
275c0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
275d0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6e  on contains no n
275e0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
275f0 20 53 51 4c 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   SQL .** functio
27600 6e 73 2e 20 44 6f 20 6e 6f 74 20 63 6f 6e 73 69  ns. Do not consi
27610 64 65 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  der non-determin
27620 69 73 74 69 63 20 53 51 4c 20 66 75 6e 63 74 69  istic SQL functi
27630 6f 6e 73 20 74 68 61 74 20 61 72 65 20 0a 2a 2a  ons that are .**
27640 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
27650 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ect statements..
27660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
27670 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  prIsDeterministi
27680 63 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  c(Expr *p){.  Wa
27690 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
276a0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
276b0 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
276c0 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
276d0 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
276e0 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 3b 0a  sDeterministic;.
276f0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
27700 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
27710 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 20 20 73  ectWalkFail;.  s
27720 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
27730 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
27740 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  w.eCode;.}../*.*
27750 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
27760 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
27770 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
27780 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
27790 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
277a0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
277b0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
277c0 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
277d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
277e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
277f0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
27800 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
27810 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
27820 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
27830 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
27840 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
27850 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
27860 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
27870 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
27880 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
27890 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
278a0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
278b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
278c0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
278d0 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
278e0 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
278f0 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
27900 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
27910 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
27920 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
27930 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
27940 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
27950 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
27960 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
27970 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
27980 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
27990 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
279a0 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
279b0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
279c0 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
279d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
279e0 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
279f0 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
27a00 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
27a10 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
27a20 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
27a30 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
27a40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
27a50 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
27a60 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
27a70 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
27a80 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
27a90 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
27aa0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
27ab0 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
27ac0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
27ad0 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
27ae0 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
27af0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
27b00 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
27b10 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
27b20 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
27b30 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
27b60 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
27b70 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b90 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
27ba0 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
27bb0 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
27bc0 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
27bd0 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
27be0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
27bf0 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
27c00 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
27c10 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
27c20 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
27c30 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
27c40 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
27c50 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
27c60 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
27c70 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
27c80 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
27c90 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
27ca0 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
27cb0 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
27cc0 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
27cd0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
27ce0 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
27cf0 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
27d00 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
27d10 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
27d20 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
27d30 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
27d40 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
27d50 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
27d60 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
27d70 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
27d80 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
27d90 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
27da0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
27db0 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
27dc0 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
27dd0 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
27de0 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
27df0 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
27e00 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
27e10 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
27e20 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
27e30 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
27e40 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
27e50 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
27e60 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
27e70 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
27e80 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
27e90 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
27ea0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
27eb0 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
27ec0 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
27ed0 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
27ee0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
27ef0 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
27f00 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
27f10 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
27f20 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
27f30 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
27f40 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
27f50 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
27f60 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
27f70 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
27f80 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
27f90 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
27fa0 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
27fb0 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
27fc0 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
27fd0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27fe0 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
27ff0 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
28000 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
28010 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
28020 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
28030 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
28040 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
28050 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
28060 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
28070 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
28080 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
28090 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
280a0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
280b0 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
280c0 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
280d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
280e0 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
280f0 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
28100 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
28110 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
28120 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
28130 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
28140 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
28150 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
28160 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
28170 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
28180 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
28190 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
281a0 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
281b0 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
281c0 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
281d0 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
281e0 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
281f0 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
28200 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
28210 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
28220 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
28230 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
28240 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
28250 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
28260 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
28270 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
28280 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
28290 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
282a0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
282b0 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
282c0 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
282d0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
282e0 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
282f0 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
28300 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
28310 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
28320 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
28330 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
28340 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
28350 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
28360 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
28370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
28380 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
28390 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
283a0 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
283b0 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
283c0 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
283d0 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
283e0 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20  R BY clause (or 
283f0 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
28400 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  use.** if the WH
28410 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
28420 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c   is set in wctrl
28430 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45  Flags) of a SELE
28440 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
28450 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
28460 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
28470 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28480 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
28490 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
284a0 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
284b0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
284c0 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
284d0 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
284e0 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61  * The iIdxCur pa
284f0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63  rameter is the c
28500 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
28510 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a  an index.  If .*
28520 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
28530 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49 64  AUSE is set, iId
28540 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
28550 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
28560 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
28570 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
28580 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
28590 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
285a0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
285b0 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
285c0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
285d0 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
285e0 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
285f0 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
28600 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
28610 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
28620 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
28630 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
28640 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
28650 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
28660 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
28670 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
28680 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
28690 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
286a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
286b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
286c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
286d0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
286e0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
286f0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  TabList,      /*
28700 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
28710 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
28720 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
28730 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
28740 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  re,           /*
28750 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
28760 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
28770 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
28780 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
28790 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
287a0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
287b0 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75   ExprList *pResu
287c0 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51 75 65 72  ltSet,   /* Quer
287d0 79 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 52  y result set.  R
287e0 65 71 27 64 20 66 6f 72 20 44 49 53 54 49 4e 43  eq'd for DISTINC
287f0 54 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  T */.  u16 wctrl
28800 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
28810 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  * The WHERE_* fl
28820 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
28830 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
28840 69 6e 74 20 69 41 75 78 41 72 67 20 20 20 20 20  int iAuxArg     
28850 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
28860 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
28870 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63   is set, index c
28880 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45         ** If WHE
288b0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68  RE_USE_LIMIT, th
288c0 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f  en the limit amo
288d0 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  unt */.){.  int 
288e0 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
288f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
28900 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
28910 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
28920 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
28930 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
28940 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28950 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
28960 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
28970 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
28980 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
28990 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
289a0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
289b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
289c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
289d0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
289e0 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
289f0 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
28a00 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
28a10 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
28a20 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
28a30 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
28a40 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
28a50 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
28a60 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
28a70 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
28a80 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
28a90 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
28aa0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
28ab0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
28ac0 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
28ad0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
28ae0 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
28af0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
28b00 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
28b10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
28b20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
28b30 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
28b40 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
28b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
28b60 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
28b70 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
28b90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
28ba0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28bd0 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65  */.  u8 bFordele
28be0 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
28bf0 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  /* OPFLAG_FORDEL
28c00 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20  ETE or zero, as 
28c10 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a  appropriate */..
28c20 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
28c30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
28c40 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d  EPASS_MULTIROW)=
28c50 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20  =0 || (.        
28c60 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28c70 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
28c80 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26  RED)!=0 .     &&
28c90 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
28ca0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
28cb0 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20  E)==0 .  ));..  
28cc0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57  /* Only one of W
28cd0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
28ce0 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45 5f 4c  E or WHERE_USE_L
28cf0 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65 72 74  IMIT */.  assert
28d00 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
28d10 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28d20 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  SE)==0.         
28d30 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
28d40 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  s & WHERE_USE_LI
28d50 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  MIT)==0 );..  /*
28d60 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
28d70 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62  lization */.  db
28d80 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
28d90 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30   memset(&sWLB, 0
28da0 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b  , sizeof(sWLB));
28db0 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f  ..  /* An ORDER/
28dc0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
28dd0 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20  of more than 63 
28de0 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20  terms cannot be 
28df0 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74  optimized */.  t
28e00 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72 42  estcase( pOrderB
28e10 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e  y && pOrderBy->n
28e20 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  Expr==BMS-1 );. 
28e30 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
28e40 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
28e50 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79  >=BMS ) pOrderBy
28e60 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72   = 0;.  sWLB.pOr
28e70 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
28e80 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  ;..  /* Disable 
28e90 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74  the DISTINCT opt
28ea0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c  imization if SQL
28eb0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
28ec0 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20  is set via.  ** 
28ed0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72  sqlite3_test_ctr
28ee0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
28ef0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
28f00 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ...) */.  if( Op
28f10 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
28f20 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69  ed(db, SQLITE_Di
28f30 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20  stinctOpt) ){.  
28f40 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20    wctrlFlags &= 
28f50 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54  ~WHERE_WANT_DIST
28f60 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  INCT;.  }..  /* 
28f70 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
28f80 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
28f90 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
28fa0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
28fb0 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
28fc0 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
28fd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
28fe0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
28ff0 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
29000 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
29010 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
29020 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
29030 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
29040 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
29050 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
29060 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
29070 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
29080 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
29090 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
290a0 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
290b0 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
290c0 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52 5f 53  f the WHERE_OR_S
290d0 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73  UBCLAUSE flag is
290e0 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68   set, then we sh
290f0 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67  ould.  ** only g
29100 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
29110 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
29120 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64   in pTabList and
29130 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a   assume that.  *
29140 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73  * any cursors as
29150 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75  sociated with su
29160 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20  bsequent tables 
29170 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  are uninitialize
29180 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69  d..  */.  nTabLi
29190 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73  st = (wctrlFlags
291a0 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
291b0 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70 54 61  LAUSE) ? 1 : pTa
291c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
291d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
291e0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
291f0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
29200 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
29210 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
29220 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
29230 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
29240 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
29250 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
29260 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
29270 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
29280 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
29290 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
292a0 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
292b0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
292c0 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
292d0 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
292e0 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
292f0 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
29300 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
29310 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
29320 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
29330 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
29340 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
29350 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
29360 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
29370 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
29380 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
29390 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
293a0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
293b0 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
293c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
293d0 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 57  RawNN(db, nByteW
293e0 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68  Info + sizeof(Wh
293f0 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28  ereLoop));.  if(
29400 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29410 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
29420 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
29430 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
29440 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
29450 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
29460 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  }.  pWInfo->pPar
29470 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
29480 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
29490 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
294a0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
294b0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
294c0 6e 66 6f 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  nfo->pWhere = pW
294d0 68 65 72 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  here;.  pWInfo->
294e0 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
294f0 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
29500 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
29510 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43  0] = pWInfo->aiC
29520 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d  urOnePass[1] = -
29530 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1;.  pWInfo->nLe
29540 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
29550 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
29560 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74   = pWInfo->iCont
29570 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
29580 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29590 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
295a0 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
295b0 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  s;.  pWInfo->iLi
295c0 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  mit = iAuxArg;. 
295d0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
295e0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
295f0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
29600 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d   memset(&pWInfo-
29610 3e 6e 4f 42 53 61 74 2c 20 30 2c 20 0a 20 20 20  >nOBSat, 0, .   
29620 20 20 20 20 20 20 6f 66 66 73 65 74 6f 66 28 57        offsetof(W
29630 68 65 72 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20  hereInfo,sWC) - 
29640 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e  offsetof(WhereIn
29650 66 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d  fo,nOBSat));.  m
29660 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61  emset(&pWInfo->a
29670 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  [0], 0, sizeof(W
29680 68 65 72 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69  hereLoop)+nTabLi
29690 73 74 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  st*sizeof(WhereL
296a0 65 76 65 6c 29 29 3b 0a 20 20 61 73 73 65 72 74  evel));.  assert
296b0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
296c0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
296d0 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64  );  /* ONEPASS d
296e0 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a  efaults to OFF *
296f0 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  /.  pMaskSet = &
29700 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
29710 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
29720 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
29730 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
29740 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
29750 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
29760 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
29770 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
29780 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
29790 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
297a0 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
297b0 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
297c0 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
297d0 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
297e0 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
297f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
29800 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
29810 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
29820 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
29830 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
29840 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
29850 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
29860 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
29870 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
29880 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
29890 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
298a0 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
298b0 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
298c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
298d0 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
298e0 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
298f0 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
29900 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
29910 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
29920 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
29930 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
29940 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
29950 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
29960 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
29970 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
29980 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
29990 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
299a0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
299b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
299c0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  IQUE;.    }.  }e
299d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69  lse{.    /* Assi
299e0 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
299f0 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
29a00 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
29a10 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  ROM clause..    
29a20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d  **.    ** The N-
29a30 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  th term of the F
29a40 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73  ROM clause is as
29a50 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b  signed a bitmask
29a60 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a   of 1<<N..    **
29a70 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65  .    ** The rule
29a80 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
29a90 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65   sentence ensure
29aa0 73 20 74 68 74 61 20 69 66 20 58 20 69 73 20 74  s thta if X is t
29ab0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20  he bitmask for. 
29ac0 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c     ** a table T,
29ad0 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65   then X-1 is the
29ae0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
29af0 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
29b00 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a   the left of T..
29b10 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74      ** Knowing t
29b20 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
29b30 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
29b40 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
29b50 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69  join is.    ** i
29b60 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
29b70 74 20 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a  t #3015..    **.
29b80 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
29b90 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72   bitmasks are cr
29ba0 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54  eated for all pT
29bb0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62  abList->nSrc tab
29bc0 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54  les in.    ** pT
29bd0 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
29be0 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
29bf0 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
29c00 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
29c10 79 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74  y.    ** equal t
29c20 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
29c30 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
29c40 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
29c50 74 68 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  the.    ** WHERE
29c60 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c  _OR_SUBCLAUSE fl
29c70 61 67 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a  ag is set..    *
29c80 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20  /.    ii = 0;.  
29c90 20 20 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61    do{.      crea
29ca0 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
29cb0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
29cc0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
29cd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62   sqlite3WhereTab
29ce0 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c  FuncArgs(pParse,
29cf0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69   &pTabList->a[ii
29d00 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ], &pWInfo->sWC)
29d10 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
29d20 2b 69 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  +ii)<pTabList->n
29d30 53 72 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20  Src );.  #ifdef 
29d40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
29d50 20 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b   {.      Bitmask
29d60 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66   mx = 0;.      f
29d70 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
29d80 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
29d90 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
29da0 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  sk m = sqlite3Wh
29db0 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b  ereGetMask(pMask
29dc0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
29dd0 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
29de0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
29df0 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20  >=mx );.        
29e00 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a  mx = m;.      }.
29e10 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20      }.  #endif. 
29e20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79   }.  .  /* Analy
29e30 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
29e40 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f  bexpressions. */
29e50 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
29e60 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
29e70 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
29e80 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
29e90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
29ea0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
29eb0 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  r;..  /* Special
29ec0 20 63 61 73 65 3a 20 57 48 45 52 45 20 74 65 72   case: WHERE ter
29ed0 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72  ms that do not r
29ee0 65 66 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c  efer to any tabl
29ef0 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20  es in the join. 
29f00 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78   ** (constant ex
29f10 70 72 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c  pressions). Eval
29f20 75 61 74 65 20 65 61 63 68 20 73 75 63 68 20 74  uate each such t
29f30 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76  erm, and jump ov
29f40 65 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  er all the.  ** 
29f50 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69  generated code i
29f60 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
29f70 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a  not true.  .  **
29f80 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20  .  ** Do not do 
29f90 74 68 69 73 20 69 66 20 74 68 65 20 65 78 70 72  this if the expr
29fa0 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
29fb0 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
29fc0 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a  c functions.  **
29fd0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69   that are not wi
29fe0 74 68 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63  thin a sub-selec
29ff0 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73  t. This is not s
2a000 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
2a010 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65  , but.  ** prese
2a020 72 76 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65  rves SQLite's le
2a030 67 61 63 79 20 62 65 68 61 76 69 6f 75 72 20 69  gacy behaviour i
2a040 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2a050 74 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a  two cases:.  **.
2a060 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20    **   FROM ... 
2a070 57 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30  WHERE random()>0
2a080 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65  ;           -- e
2a090 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63  val random() onc
2a0a0 65 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20  e per row.  **  
2a0b0 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20   FROM ... WHERE 
2a0c0 28 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29  (SELECT random()
2a0d0 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61  )>0;  -- eval ra
2a0e0 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72  ndom() once over
2a0f0 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  all.  */.  for(i
2a100 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43  i=0; ii<sWLB.pWC
2a110 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
2a120 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2a130 54 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61  T = &sWLB.pWC->a
2a140 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54  [ii];.    if( pT
2a150 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26  ->prereqAll==0 &
2a160 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  & (nTabList==0 |
2a170 7c 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e  | exprIsDetermin
2a180 69 73 74 69 63 28 70 54 2d 3e 70 45 78 70 72 29  istic(pT->pExpr)
2a190 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2a1a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
2a1b0 61 72 73 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c  arse, pT->pExpr,
2a1c0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
2a1d0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2a1e0 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77  LL);.      pT->w
2a1f0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
2a200 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
2a210 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
2a220 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2a230 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
2a240 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
2a250 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
2a260 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
2a270 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
2a280 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
2a290 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
2a2a0 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
2a2b0 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
2a2c0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2a2d0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2a2e0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2a2f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a300 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2a310 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
2a320 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
2a330 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
2a340 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
2a350 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
2a360 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
2a370 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
2a380 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
2a390 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2a3a0 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
2a3b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a3c0 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
2a3d0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2a3e0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  */.#if defined(W
2a3f0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2a400 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  D).  if( sqlite3
2a410 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 66  WhereTrace & 0xf
2a420 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fff ){.    sqlit
2a430 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a  e3DebugPrintf("*
2a440 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
2a450 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61  rt *** (wctrlFla
2a460 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46  gs: 0x%x",wctrlF
2a470 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77  lags);.    if( w
2a480 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a490 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_USE_LIMIT ){. 
2a4a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2a4b0 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74  gPrintf(", limit
2a4c0 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b  : %d", iAuxArg);
2a4d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a4e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
2a4f0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
2a500 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2a510 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20  e & 0x100 ){ /* 
2a520 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
2a530 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2a540 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  lause */.    sql
2a550 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50  ite3WhereClauseP
2a560 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a  rint(sWLB.pWC);.
2a570 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2a580 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c  ( nTabList!=1 ||
2a590 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26   whereShortCut(&
2a5a0 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sWLB)==0 ){.    
2a5b0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2a5c0 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20  dAll(&sWLB);.   
2a5d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
2a5e0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2a5f0 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54    .#ifdef WHERET
2a600 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2a610 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2a620 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20  eTrace ){    /* 
2a630 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
2a640 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
2a650 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68  ects */.      Wh
2a660 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
2a670 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
2a680 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2a690 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
2a6a0 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
2a6b0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
2a6c0 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6f0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
2a700 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
2a710 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
2a720 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
2a730 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
2a740 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
2a750 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
2a760 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  i%(sizeof(zLabel
2a770 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  )-1)];.        w
2a780 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
2a790 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
2a7a0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
2a7b0 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
2a7c0 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2a7d0 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
2a7e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2a7f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2a800 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
2a810 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
2a820 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
2a830 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2a840 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
2a850 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
2a860 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a870 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2a880 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
2a890 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
2a8a0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
2a8b0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2a8c0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
2a8d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
2a8e0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c  fo->revMask = AL
2a8f0 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28  LBITS;.  }.  if(
2a900 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2a910 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
2a920 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20  cFailed) ){.    
2a930 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2a940 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rror;.  }.#ifdef
2a950 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2a960 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2a970 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
2a980 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2a990 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75  rintf("---- Solu
2a9a0 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70  tion nRow=%d", p
2a9b0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
2a9c0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2a9d0 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20  >nOBSat>0 ){.   
2a9e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2a9f0 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
2aa00 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e  %d,0x%llx", pWIn
2aa10 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e  fo->nOBSat, pWIn
2aa20 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20  fo->revMask);.  
2aa30 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
2aa40 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2aa50 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
2aa60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2aa70 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
2aa80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2aa90 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2aaa0 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20  unique");.      
2aab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2aac0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
2aad0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
2aae0 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2aaf0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ab00 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64  ("  DISTINCT=ord
2ab10 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
2ab20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2ab30 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
2ab40 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2ab50 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2ab60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ab70 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f  ("  DISTINCT=uno
2ab80 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
2ab90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2aba0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2abb0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
2abc0 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  n");.    for(ii=
2abd0 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  0; ii<pWInfo->nL
2abe0 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  evel; ii++){.   
2abf0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2ac00 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e  t(pWInfo->a[ii].
2ac10 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43  pWLoop, sWLB.pWC
2ac20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2ac30 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  dif.  /* Attempt
2ac40 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20   to omit tables 
2ac50 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68  from the join th
2ac60 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74  at do not effect
2ac70 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
2ac80 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
2ac90 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65  vel>=2.   && pRe
2aca0 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26  sultSet!=0.   &&
2acb0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2acc0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2acd0 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20  OmitNoopJoin).  
2ace0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74  ){.    Bitmask t
2acf0 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33  abUsed = sqlite3
2ad00 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
2ad10 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65  ge(pMaskSet, pRe
2ad20 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66  sultSet);.    if
2ad30 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20  ( sWLB.pOrderBy 
2ad40 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64  ){.      tabUsed
2ad50 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
2ad60 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
2ad70 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
2ad80 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  derBy);.    }.  
2ad90 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
2ada0 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20  >nLevel>=2 ){.  
2adb0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2adc0 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  Term, *pEnd;.   
2add0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
2ade0 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  o->a[pWInfo->nLe
2adf0 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  vel-1].pWLoop;. 
2ae00 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
2ae10 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2ae20 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f  oop->iTab].fg.jo
2ae30 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
2ae40 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2ae50 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2ae60 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
2ae70 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
2ae80 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
2ae90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2aea0 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
2aeb0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
2aec0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2aed0 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
2aee0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
2aef0 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
2af00 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
2af10 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
2af20 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
2af30 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
2af40 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
2af50 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2af60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2af70 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
2af80 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
2af90 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
2afa0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
2afb0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
2afc0 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
2afd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
2afe0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2aff0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2b000 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
2b010 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
2b020 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
2b030 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
2b040 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
2b050 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
2b060 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
2b070 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
2b080 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
2b090 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
2b0a0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
2b0b0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
2b0c0 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
2b0d0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2b0e0 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
2b0f0 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
2b100 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2b110 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2b120 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2b130 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2b140 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2b150 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2b160 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2b170 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2b180 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2b190 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2b1a0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2b1b0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2b1c0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2b1d0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2b1e0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2b1f0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
2b200 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
2b210 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
2b220 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2b230 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
2b240 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
2b250 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
2b260 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77  .    if( bOnerow
2b270 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c  .     || ((wctrl
2b280 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2b290 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21  EPASS_MULTIROW)!
2b2a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2b2b0 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57   0==(wsFlags & W
2b2c0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b2d0 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  E)).    ){.     
2b2e0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2b2f0 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e  s = bOnerow ? ON
2b300 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f  EPASS_SINGLE : O
2b310 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20  NEPASS_MULTI;.  
2b320 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
2b330 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
2b340 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67  pTab) && (wsFlag
2b350 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2b360 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LY) ){.        i
2b370 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2b380 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2b390 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  LTIROW ){.      
2b3a0 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d      bFordelete =
2b3b0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
2b3c0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
2b3d0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
2b3e0 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2b3f0 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e  s = (wsFlags & ~
2b400 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b  WHERE_IDX_ONLY);
2b410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b420 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
2b430 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2b440 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
2b450 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
2b460 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
2b470 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
2b480 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
2b490 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2b4a0 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
2b4b0 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
2b4c0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2b4d0 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
2b4e0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
2b4f0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
2b500 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
2b510 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2b520 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
2b530 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2b540 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2b550 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
2b560 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2b570 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2b580 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
2b590 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2b5a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2b5b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2b5c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2b5d0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
2b5e0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
2b5f0 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2b600 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2b610 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2b620 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2b630 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2b640 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2b650 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2b660 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2b670 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2b680 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2b690 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
2b6a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b6b0 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
2b6c0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
2b6d0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
2b6e0 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
2b6f0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
2b700 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
2b710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2b720 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
2b730 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
2b740 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
2b750 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
2b760 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
2b770 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
2b780 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2b790 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2b7a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2b7b0 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
2b7c0 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
2b7d0 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2b7e0 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20  CLAUSE)==0 ){.  
2b7f0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
2b800 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
2b810 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2b820 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
2b830 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  F ){.        op 
2b840 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
2b850 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2b860 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
2b870 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2b880 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  sor;.      };.  
2b890 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
2b8a0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
2b8b0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
2b8c0 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
2b8d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b8e0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d  abItem->iCursor=
2b8f0 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
2b900 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2b910 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2b920 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2b930 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2b940 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2b950 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2b960 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2b970 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2b980 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2b990 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2b9a0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2b9b0 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
2b9c0 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f  Col<BMS && HasRo
2b9d0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2b9e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
2b9f0 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
2ba00 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
2ba10 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
2ba20 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
2ba30 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
2ba40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ba50 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45  P4(v, -1, SQLITE
2ba60 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
2ba70 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
2ba80 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
2ba90 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
2baa0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2bab0 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
2bac0 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  HINTS.      if( 
2bad0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2bae0 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
2baf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2bb00 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
2bb10 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c  G_SEEKEQ|bFordel
2bb20 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ete);.      }els
2bb30 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
2bb40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bb50 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2bb60 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
2bb70 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2bb80 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
2bb90 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
2bba0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bbb0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
2bbc0 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74  umnsUsed, pTabIt
2bbd0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20  em->iCursor, 0, 
2bbe0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2bc00 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49  const u8*)&pTabI
2bc10 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34  tem->colUsed, P4
2bc20 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
2bc30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bc40 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
2bc50 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
2bc60 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
2bc70 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2bc80 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
2bc90 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2bca0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
2bcb0 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
2bcc0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2bcd0 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
2bce0 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
2bcf0 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
2bd00 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
2bd10 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61 79  iAuxArg is alway
2bd20 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
2bd30 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
2bd40 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
2bd50 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2bd60 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20  ert( iAuxArg!=0 
2bd70 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
2bd80 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2bd90 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2bda0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2bdb0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2bdc0 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
2bdd0 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
2bde0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2bdf0 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2be00 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29  AUSE)!=0.      )
2be10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2be20 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66  s is one term of
2be30 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74   an OR-optimizat
2be40 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52  ion using the PR
2be50 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20  IMARY KEY of a. 
2be60 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55         ** WITHOU
2be70 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
2be80 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65  No need for a se
2be90 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a  parate index */.
2bea0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2beb0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
2bec0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  Cur;.        op 
2bed0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2bee0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2bef0 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2bf00 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  FF ){.        In
2bf10 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
2bf20 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
2bf30 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
2bf40 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  Cur = iAuxArg;. 
2bf50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
2bf60 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2bf70 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2bf80 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
2bf90 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
2bfa0 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
2bfb0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2bfc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
2bfd0 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
2bfe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bff0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
2c000 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
2c010 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2c020 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
2c030 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2c040 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74 72  iAuxArg && (wctr
2c050 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2c060 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20  R_SUBCLAUSE)!=0 
2c070 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  ){.        iInde
2c080 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
2c090 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2c0a0 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20  ReopenIdx;.     
2c0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c0c0 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72  iIndexCur = pPar
2c0d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2c0e0 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
2c0f0 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64  ->iIdxCur = iInd
2c100 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  exCur;.      ass
2c110 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
2c120 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
2c130 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2c140 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
2c150 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29  ;.      if( op )
2c160 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c170 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
2c180 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
2c190 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
2c1a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c1b0 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
2c1c0 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
2c1d0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
2c1e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2c1f0 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a  _CONSTRAINT)!=0.
2c200 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f           && (pLo
2c210 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
2c220 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2c230 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  E|WHERE_SKIPSCAN
2c240 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ))==0.         &
2c250 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2c260 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
2c270 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20  RBY_MIN)==0.    
2c280 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
2c290 65 44 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45  eDistinct!=WHERE
2c2a0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2c2b0 44 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  D.        ){.   
2c2c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c2d0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2c2e0 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a  FLAG_SEEKEQ); /*
2c2f0 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20   Hint to COMDB2 
2c300 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
2c310 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c320 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
2c330 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
2c340 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2c350 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
2c360 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2c370 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d     u64 colUsed =
2c380 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2c390 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20  t ii, jj;.      
2c3a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2c3b0 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  <pIx->nColumn; i
2c3c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2c3d0 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f    jj = pIx->aiCo
2c3e0 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20  lumn[ii];.      
2c3f0 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29        if( jj<0 )
2c400 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c410 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33         if( jj>63
2c420 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20   ) jj = 63;.    
2c430 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
2c440 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  bItem->colUsed &
2c450 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30   MASKBIT(jj))==0
2c460 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c470 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
2c480 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69   |= ((u64)1)<<(i
2c490 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b  i<63 ? ii : 63);
2c4a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c4b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c4c0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2c4d0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2c4e0 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c  iIndexCur, 0, 0,
2c4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c510 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20   (u8*)&colUsed, 
2c520 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  P4_INT64);.     
2c530 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
2c540 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
2c550 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f  UMN_USED_MASK */
2c560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c570 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
2c580 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
2c590 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
2c5a0 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
2c5b0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
2c5c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2c5d0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
2c5e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2c5f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2c600 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
2c610 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2c620 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
2c630 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2c640 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
2c650 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
2c660 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
2c670 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
2c680 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
2c690 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
2c6a0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2c6b0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
2c6c0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
2c6d0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
2c6e0 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
2c6f0 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20    int wsFlags;. 
2c700 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2c710 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  nfo->a[ii];.    
2c720 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  wsFlags = pLevel
2c730 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2c740 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
2c750 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2c760 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
2c770 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2c780 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c790 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
2c7a0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
2c7b0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
2c7c0 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
2c7d0 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
2c7e0 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
2c7f0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2c800 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
2c810 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
2c820 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c830 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2c840 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
2c850 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78  endif.    addrEx
2c860 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  plain = sqlite3W
2c870 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
2c880 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  an(.        pPar
2c890 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
2c8a0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
2c8b0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
2c8c0 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  ags.    );.    p
2c8d0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20  Level->addrBody 
2c8e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2c8f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2c900 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69   notReady = sqli
2c910 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c  te3WhereCodeOneL
2c920 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
2c930 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a   ii, notReady);.
2c940 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
2c950 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
2c960 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66  addrCont;.    if
2c970 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45  ( (wsFlags&WHERE
2c980 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26  _MULTI_OR)==0 &&
2c990 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
2c9a0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2c9b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2c9c0 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e  ite3WhereAddScan
2c9d0 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69  Status(v, pTabLi
2c9e0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72  st, pLevel, addr
2c9f0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a  Explain);.    }.
2ca00 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
2ca10 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
2ca20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
2ca30 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  n WHERE-core"));
2ca40 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
2ca50 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
2ca60 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
2ca70 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
2ca80 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
2ca90 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
2caa0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2cab0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2cac0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
2cad0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2cae0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
2caf0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2cb00 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
2cb10 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
2cb20 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
2cb30 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
2cb40 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
2cb50 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2cb60 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
2cb70 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2cb80 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2cb90 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
2cba0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2cbb0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
2cbc0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2cbd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
2cbe0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2cbf0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2cc00 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
2cc10 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2cc20 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2cc30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2cc40 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2cc50 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2cc60 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2cc70 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
2cc80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
2cc90 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2cca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2ccb0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2ccc0 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
2ccd0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
2cce0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61   i--){.    int a
2ccf0 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ddr;.    pLevel 
2cd00 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
2cd10 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2cd20 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
2cd30 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
2cd40 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e  =OP_Noop ){.#ifn
2cd50 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2cd60 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2cd70 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e 74 20  TINCT.      int 
2cd80 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20  addrSeek = 0;.  
2cd90 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2cda0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2cdb0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2cdc0 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
2cdd0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2cde0 44 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f  D.       && (pLo
2cdf0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2ce00 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
2ce10 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20         && (pIdx 
2ce20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2ce30 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61  .pIndex)->hasSta
2ce40 74 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20  t1.       && (n 
2ce50 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2ce60 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20  .nIdxCol)>0.    
2ce70 20 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f     && pIdx->aiRo
2ce80 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20  wLogEst[n]>=36. 
2ce90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cea0 69 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d  int r1 = pParse-
2ceb0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
2cec0 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20   int j, op;.    
2ced0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
2cee0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2cef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cf00 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2cf10 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
2cf20 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20  r, j, r1+j);.   
2cf30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2cf40 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
2cf50 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  +1;.        op =
2cf60 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2cf70 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54  Prev ? OP_SeekLT
2cf80 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20   : OP_SeekGT;.  
2cf90 20 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d        addrSeek =
2cfa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2cfb0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65  p4Int(v, op, pLe
2cfc0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c  vel->iIdxCur, 0,
2cfd0 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20   r1, n);.       
2cfe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2cff0 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  v, op==OP_SeekLT
2d000 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2d010 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
2d020 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20  =OP_SeekGT);.   
2d030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2d050 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  o, 1, pLevel->p2
2d060 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2d070 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41  f /* SQLITE_DISA
2d080 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49  BLE_SKIPAHEAD_DI
2d090 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20  STINCT */.      
2d0a0 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
2d0b0 73 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  se: Advance to t
2d0c0 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  he next row */. 
2d0d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d0e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2d0f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2d100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d110 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c  VdbeAddOp3(v, pL
2d120 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
2d130 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
2d140 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20  , pLevel->p3);. 
2d150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d160 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
2d170 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56  el->p5);.      V
2d180 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2d190 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2d1a0 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2d1b0 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20  op==OP_Next);.  
2d1c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2d1d0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2d1e0 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
2d1f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2d200 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
2d210 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64  OP_VNext);.#ifnd
2d220 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2d230 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54  E_SKIPAHEAD_DIST
2d240 49 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61  INCT.      if( a
2d250 64 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65  ddrSeek ) sqlite
2d260 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2d270 20 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64   addrSeek);.#end
2d280 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
2d290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2d2a0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2d2b0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2d2c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d2d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2d2e0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
2d2f0 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
2d300 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
2d310 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
2d320 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2d330 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d340 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2d350 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
2d360 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
2d370 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
2d380 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
2d390 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
2d3a0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
2d3b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d3c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2d3d0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
2d3e0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
2d3f0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21  pIn->eEndLoopOp!
2d400 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
2d410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d420 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
2d430 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
2d440 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
2d450 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
2d460 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2d470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2d480 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2d490 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
2d4a0 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a  OP_PrevIfOpen);.
2d4b0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2d4c0 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
2d4d0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
2d4e0 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20  NextIfOpen);.   
2d4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2d500 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d510 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
2d520 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
2d530 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2d540 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2d550 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2d560 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
2d570 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2d580 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d590 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
2d5a0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
2d5b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d5c0 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
2d5d0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
2d5e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2d5f0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
2d600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d610 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2d620 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
2d630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d640 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2d650 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
2d660 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2d670 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
2d680 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20  _MATCH_BLOBS.   
2d690 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
2d6a0 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20  rLikeRep ){.    
2d6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d6c0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
2d6d0 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c  mpZero, (int)(pL
2d6e0 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
2d6f0 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20  tr>>1),.        
2d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d710 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
2d720 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Rep);.      Vdbe
2d730 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2d740 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
2d750 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
2d760 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
2d770 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
2d780 6c 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72  lags;.      addr
2d790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2d7a0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
2d7b0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
2d7c0 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  oin); VdbeCovera
2d7d0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  ge(v);.      ass
2d7e0 65 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45  ert( (ws & WHERE
2d7f0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c  _IDX_ONLY)==0 ||
2d800 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
2d810 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
2d820 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
2d830 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
2d840 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d850 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2d860 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
2d870 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2d880 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2d890 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
2d8a0 45 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20  E_INDEXED) .    
2d8b0 20 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45     || ((ws & WHE
2d8c0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20  RE_MULTI_OR) && 
2d8d0 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
2d8e0 78 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  x) .      ){.   
2d8f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d900 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
2d910 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
2d920 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
2d930 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
2d940 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
2d950 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2d960 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d970 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
2d980 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
2d990 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
2d9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2d9b0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2d9c0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2d9d0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
2d9e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d9f0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
2da00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
2da10 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2da20 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
2da30 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
2da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da50 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2da60 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2da70 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
2da80 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
2da90 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
2daa0 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
2dab0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2dac0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
2dad0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
2dae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2daf0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
2db00 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
2db10 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2db20 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
2db30 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
2db40 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
2db50 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
2db60 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
2db70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
2db80 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
2db90 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
2dba0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
2dbb0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2dbc0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2dbd0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2dbe0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2dbf0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2dc00 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
2dc10 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
2dc20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
2dc30 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2dc40 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
2dc50 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
2dc60 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
2dc70 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
2dc80 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
2dc90 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
2dca0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43  outine into OP_C
2dcb0 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  opy of result co
2dcc0 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67  ntained in a reg
2dcd0 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50  ister..    ** OP
2dce0 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f  _Rowid becomes O
2dcf0 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  P_Null..    */. 
2dd00 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
2dd10 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2dd20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
2dd30 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  se( pParse->db->
2dd40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2dd50 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
2dd60 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72  olumnToCopy(pPar
2dd70 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  se, pLevel->addr
2dd80 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Body, pLevel->iT
2dd90 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddb0 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67     pTabItem->reg
2ddc0 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20  Result, 0);.    
2ddd0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2dde0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
2ddf0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
2de00 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
2de10 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
2de20 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
2de30 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
2de40 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
2de50 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2de60 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
2de70 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
2de80 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
2de90 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
2dea0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
2deb0 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
2dec0 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
2ded0 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
2dee0 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
2def0 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
2df00 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
2df10 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
2df20 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
2df30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2df40 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
2df50 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
2df60 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
2df70 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
2df80 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
2df90 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
2dfa0 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
2dfb0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
2dfc0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
2dfd0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
2dfe0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
2dff0 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
2e000 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
2e010 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
2e020 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
2e030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2e040 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2e050 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
2e060 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
2e070 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
2e080 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2e090 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
2e0a0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2e0b0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
2e0c0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
2e0d0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
2e0e0 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
2e0f0 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20    if( pIdx.     
2e100 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  && (pWInfo->eOne
2e110 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2e120 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  F || !HasRowid(p
2e130 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20  Idx->pTable)).  
2e140 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f     && !db->mallo
2e150 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20  cFailed.    ){. 
2e160 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
2e170 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2e180 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d  dr(v);.      k =
2e190 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
2e1a0 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  y;.      pOp = s
2e1b0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2e1c0 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  v, k);.      for
2e1d0 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  (; k<last; k++, 
2e1e0 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
2e1f0 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
2e200 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
2e210 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2e220 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2e230 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
2e240 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d           int x =
2e250 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
2e260 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
2e270 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  ->pTable==pTab )
2e280 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e290 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2e2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ){.            I
2e2b0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
2e2c0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2e2d0 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
2e2e0 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61        x = pPk->a
2e2f0 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20  iColumn[x];.    
2e300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e310 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
2e320 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20    }.          x 
2e330 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
2e340 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b  fIndex(pIdx, x);
2e350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
2e360 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2e370 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a     pOp->p2 = x;.
2e380 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
2e390 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2e3a0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2e3b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2e3c0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2e3d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2e3e0 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d  _ONLY)==0 || x>=
2e3f0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
2e400 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65   || pWInfo->eOne
2e410 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20  Pass );.        
2e420 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
2e430 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
2e440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
2e450 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2e460 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2e470 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
2e480 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
2e490 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2e4a0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2e4b0 66 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  fNullRow ){.    
2e4c0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
2e4d0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2e4e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e4f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2e500 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
2e510 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
2e520 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
2e530 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
2e540 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
2e550 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
2e560 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.