/ Hex Artifact Content
Login

Artifact 101f0a645c45c12141b38a61b593232555fc001bf7786dcb03eb8f313783b404:


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 49 53 4e 55 4c 4c 7c 57 4f 5f 45  ~(WO_ISNULL|WO_E
7920: 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20  QUIV|WO_IS))==0 
7930: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7940: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
7950: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
7960: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7970: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75  assert( pTerm->u
7980: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31  .leftColumn>=(-1
7990: 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  ) );.    nTerm++
79a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
79b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
79c0: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
79d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
79e0: 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
79f0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
7a00: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
7a10: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
7a20: 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
7a30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
7a50: 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
7a60: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
7a70: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
7a80: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
7a90: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
7aa0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
7ab0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7ac0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
7ad0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
7ae0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
7af0: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
7b00: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
7b10: 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
7b20: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
7b30: 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
7b40: 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
7b50: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7b60: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
7b70: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7b80: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
7b90: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ba0: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
7bb0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
7bc0: 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
7bf0: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
7c00: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
7c30: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
7c40: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
7c50: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
7c60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7c70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
7c80: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
7c90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7ca0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7cb0: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
7cc0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
7cd0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7ce0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
7cf0: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
7d00: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
7d10: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
7d20: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
7d30: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
7d40: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
7d50: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
7d60: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
7d70: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
7d80: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
7d90: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
7da0: 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
7db0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7dc0: 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
7dd0: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
7de0: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
7df0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7e00: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
7e10: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
7e20: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7e30: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7e40: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
7e50: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
7e60: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
7e70: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
7e80: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
7e90: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
7ea0: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
7eb0: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7ec0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7ed0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
7ee0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
7ef0: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
7f00: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7f10: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
7f20: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
7f30: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
7f40: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7f50: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7f60: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
7f70: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
7f80: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
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 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
7fd0: 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
7fe0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
7ff0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
8000: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
8010: 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66     u8 op;.    if
8020: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
8030: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
8040: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
8050: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8060: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
8070: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
8080: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
8090: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
80a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
80b0: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
80c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
80d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
80e0: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
80f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
8100: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
8110: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8120: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8130: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
8140: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8150: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8160: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
8170: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8180: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
8190: 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49  LL|WO_EQUIV|WO_I
81a0: 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
81b0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
81c0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
81d0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
81e0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
81f0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8200: 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  mn>=(-1) );.    
8210: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
8220: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
8230: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
8240: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
8250: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
8260: 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
8270: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
8280: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
8290: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
82a0: 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  EQ;.    if( op==
82b0: 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  WO_MATCH ){.    
82c0: 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d    op = pTerm->eM
82d0: 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  atchOp;.    }.  
82e0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
82f0: 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68   = op;.    /* Th
8300: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
8310: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
8320: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
8330: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
8340: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
8350: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
8360: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
8370: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
8380: 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
8390: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
83a0: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
83b0: 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
83c0: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
83d0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
83e0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
83f0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
8400: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8410: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
8420: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
8430: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8440: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
8450: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
8460: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
8470: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
8480: 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
8490: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
84a0: 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
84b0: 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
84c0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
84d0: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
84e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
84f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8500: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f   (WO_IN|WO_EQ|WO
8510: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
8520: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
8530: 29 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 20 26  );..    if( op &
8540: 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f   (WO_LT|WO_LE|WO
8550: 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20  _GT|WO_GE).     
8560: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
8570: 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45  Vector(pTerm->pE
8580: 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20 20  xpr->pRight) .  
8590: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69    ){.      if( i
85a0: 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d  <16 ) mNoOmit |=
85b0: 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20   (1 << i);.     
85c0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29   if( op==WO_LT )
85d0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
85e0: 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 69  = WO_LE;.      i
85f0: 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70  f( op==WO_GT ) p
8600: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
8610: 57 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  WO_GE;.    }..  
8620: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
8630: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
8640: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8650: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
8660: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8670: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
8680: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
8690: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
86a0: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
86b0: 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
86c0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
86d0: 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69  .  }..  *pmNoOmi
86e0: 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72  t = mNoOmit;.  r
86f0: 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
8700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
8710: 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
8720: 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
8730: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8740: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
8750: 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
8760: 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
8770: 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
8780: 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
8790: 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
87a0: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
87b0: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
87c0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
87d0: 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
87e0: 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
87f0: 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
8800: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
8810: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
8820: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8830: 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
8840: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
8850: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
8860: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
8870: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
8880: 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
8890: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
88a0: 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
88b0: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
88c0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
88d0: 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
88e0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
88f0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
8900: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
8910: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
8920: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
8930: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
8940: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
8950: 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
8960: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
8970: 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
8980: 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
8990: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
89a0: 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
89b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
89c0: 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
89d0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
89e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
89f0: 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
8a00: 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
8a10: 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
8a20: 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Vtab;.  int rc;.
8a30: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
8a40: 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
8a50: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
8a60: 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
8a70: 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
8a80: 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
8a90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8aa0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
8ab0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
8ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
8ad0: 6d 46 61 75 6c 74 28 70 50 61 72 73 65 2d 3e 64  mFault(pParse->d
8ae0: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  b);.    }else if
8af0: 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
8b00: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
8b10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8b20: 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
8b30: 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
8b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8b50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8b60: 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
8b70: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
8b80: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8b90: 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
8ba0: 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
8bb0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 23 69  zErrMsg = 0;..#i
8bc0: 66 20 30 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  f 0.  /* This er
8bd0: 72 6f 72 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ror is now caugh
8be0: 74 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  t by the caller.
8bf0: 0a 20 20 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  .  ** Search for
8c00: 20 22 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c   "xBestIndex mal
8c10: 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f 77 20  function" below 
8c20: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8c30: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
8c40: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
8c50: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
8c60: 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
8c70: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
8c80: 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
8c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8ca0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8cb0: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
8cc0: 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
8cd0: 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
8ce0: 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
8cf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
8d00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
8d10: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
8d20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
8d30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8d40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
8d50: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
8d60: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8d70: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
8d80: 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61  stimate the loca
8d90: 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63  tion of a partic
8da0: 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61  ular key among a
8db0: 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a  ll keys in an.**
8dc0: 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74   index.  Store t
8dd0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53  he results in aS
8de0: 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  tat as follows:.
8df0: 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30  **.**    aStat[0
8e00: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
8e10: 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20  er of rows less 
8e20: 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20  than pRec.**    
8e30: 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73  aStat[1]      Es
8e40: 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
8e50: 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a  s equal to pRec.
8e60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
8e70: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61   index of the sa
8e80: 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65  mple that is the
8e90: 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   smallest sample
8ea0: 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61   that.** is grea
8eb0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
8ec0: 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20  l to pRec. Note 
8ed0: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
8ee0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a  is not an index.
8ef0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d  ** into the aSam
8f00: 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74  ple[] array - it
8f10: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74   is an index int
8f20: 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20  o a virtual set 
8f30: 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61  of samples.** ba
8f40: 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
8f50: 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d  nts of aSample[]
8f60: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
8f70: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63  of fields in rec
8f80: 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a  ord .** pRec. .*
8f90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
8fa0: 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
8fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8fd0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8fe0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
8ff0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
9000: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
9010: 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
9020: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
9030: 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
9040: 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
9050: 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
9060: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
9070: 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
9080: 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
9090: 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
90a0: 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
90b0: 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90d0: 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
90e0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
90f0: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
9100: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
9110: 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
9120: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9130: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9140: 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
9150: 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
9160: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
9190: 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63  t sample >= pRec
91a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c   */.  int iSampl
91b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
91c0: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
91d0: 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
91e0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
91f0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20  c */.  int iMin 
9200: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9210: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
9220: 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65  ample not yet te
9230: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  sted */.  int iT
9240: 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
9250: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61        /* Next sa
9260: 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  mple to test */.
9270: 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9290: 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   Result of compa
92a0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
92b0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
92e0: 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a  elds in pRec */.
92f0: 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
9300: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
9310: 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d   anLt[] + anEq[]
9320: 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70   of largest samp
9330: 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a  le pRec is > */.
9340: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9350: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
9360: 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
9370: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
9380: 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
9390: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
93a0: 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
93b0: 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
93c0: 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e  eld>0 && pRec->n
93d0: 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61  Field<=pIdx->nSa
93e0: 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a  mpleCol );..  /*
93f0: 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   Do a binary sea
9400: 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  rch to find the 
9410: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65  first sample gre
9420: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
9430: 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e  al.  ** to pRec.
9440: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
9450: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  s a single field
9460: 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  , the set of sam
9470: 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20  ples to search. 
9480: 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68   ** is simply th
9490: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
94a0: 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65  y. If the sample
94b0: 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63  s in aSample[] c
94c0: 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a  ontain more.  **
94d0: 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73   than one fields
94e0: 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c  , all fields fol
94f0: 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74  lowing the first
9500: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20   are ignored..  
9510: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20  **.  ** If pRec 
9520: 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64  contains N field
9530: 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f  s, where N is mo
9540: 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65  re than one, the
9550: 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  n as well as the
9560: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e  .  ** samples in
9570: 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e   aSample[] (trun
9580: 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64  cated to N field
9590: 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61  s), the search a
95a0: 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  lso has to.  ** 
95b0: 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65  consider prefixe
95c0: 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c  s of those sampl
95d0: 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  es. For example,
95e0: 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73   if the set of s
95f0: 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61  amples.  ** in a
9600: 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a  Sample is:.  **.
9610: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9620: 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20  [0] = (a, 5) .  
9630: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31  **     aSample[1
9640: 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a  ] = (a, 10) .  *
9650: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d  *     aSample[2]
9660: 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20   = (b, 5) .  ** 
9670: 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d      aSample[3] =
9680: 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
9690: 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d      aSample[4] =
96a0: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
96b0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61   ** Then the sea
96c0: 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64  rch space should
96d0: 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20   ideally be the 
96e0: 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e  samples above an
96f0: 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71  d the .  ** uniq
9700: 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c  ue prefixes [a],
9710: 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75   [b] and [c]. Bu
9720: 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20  t since that is 
9730: 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65  hard to organize
9740: 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  , .  ** the code
9750: 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68   actually search
9760: 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a  es this set:.  *
9770: 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61  *.  **     0: (a
9780: 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28  ) .  **     1: (
9790: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
97a0: 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  2: (a, 10) .  **
97b0: 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20       3: (a, 10) 
97c0: 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29  .  **     4: (b)
97d0: 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62   .  **     5: (b
97e0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36  , 5) .  **     6
97f0: 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (c) .  **     
9800: 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a  7: (c, 100) .  *
9810: 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35  *     8: (c, 105
9820: 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63  ).  **     9: (c
9830: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
9840: 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65   For each sample
9850: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
9860: 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c  ] array, N sampl
9870: 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  es are present i
9880: 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63  n the.  ** effec
9890: 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61  tive sample arra
98a0: 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c  y. In the above,
98b0: 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31   samples 0 and 1
98c0: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20   are based on . 
98d0: 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   ** sample aSamp
98e0: 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32  le[0]. Samples 2
98f0: 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c   and 3 on aSampl
9900: 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  e[1] etc..  **. 
9910: 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c   ** Often, sampl
9920: 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63  e i of each bloc
9930: 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65  k of N effective
9940: 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b   samples has (i+
9950: 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20  1) fields..  ** 
9960: 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d  Except, each sam
9970: 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e  ple may be exten
9980: 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ded to ensure th
9990: 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72  at it is greater
99a0: 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71   than or.  ** eq
99b0: 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69  ual to the previ
99c0: 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ous sample in th
99d0: 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61  e array. For exa
99e0: 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f  mple, in the abo
99f0: 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65  ve, .  ** sample
9a00: 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20   2 is the first 
9a10: 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63  sample of a bloc
9a20: 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20  k of N samples, 
9a30: 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a  so at first it .
9a40: 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61    ** appears tha
9a50: 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31  t it should be 1
9a60: 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20   field in size. 
9a70: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f  However, that wo
9a80: 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a  uld make it .  *
9a90: 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73  * smaller than s
9aa0: 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20  ample 1, so the 
9ab0: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f  binary search wo
9ac0: 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73  uld not work. As
9ad0: 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a   a result, .  **
9ae0: 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20   it is extended 
9af0: 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54  to two fields. T
9b00: 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68  he duplicates th
9b10: 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20  at this creates 
9b20: 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75  do not .  ** cau
9b30: 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
9b40: 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d  .  */.  nField =
9b50: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20   pRec->nField;. 
9b60: 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61   iCol = 0;.  iSa
9b70: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61  mple = pIdx->nSa
9b80: 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20  mple * nField;. 
9b90: 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61   do{.    int iSa
9ba0: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
9bb0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9bc0: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20  in aSample[] of 
9bd0: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20  test sample */. 
9be0: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
9c10: 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d  elds in test sam
9c20: 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73  ple */..    iTes
9c30: 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c  t = (iMin+iSampl
9c40: 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20  e)/2;.    iSamp 
9c50: 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64  = iTest / nField
9c60: 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e  ;.    if( iSamp>
9c70: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
9c80: 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63  e proposed effec
9c90: 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61  tive sample is a
9ca0: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
9cb0: 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e aSample[iSamp]
9cc0: 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69  ..      ** Speci
9cd0: 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f  fically, the sho
9ce0: 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rtest prefix of 
9cf0: 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54  at least (1 + iT
9d00: 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20  est%nField) .   
9d10: 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61     ** fields tha
9d20: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9d30: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  n the previous e
9d40: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e  ffective sample.
9d50: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e    */.      for(n
9d60: 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64  =(iTest % nField
9d70: 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b  ) + 1; n<nField;
9d80: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   n++){.        i
9d90: 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  f( aSample[iSamp
9da0: 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61  -1].anLt[n-1]!=a
9db0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9dc0: 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b  Lt[n-1] ) break;
9dd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9de0: 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54  se{.      n = iT
9df0: 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a  est + 1;.    }..
9e00: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9e10: 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20   = n;.    res = 
9e20: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9e30: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9e40: 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70  [iSamp].n, aSamp
9e50: 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65  le[iSamp].p, pRe
9e60: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  c);.    if( res<
9e70: 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
9e80: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
9e90: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61  p].anLt[n-1] + a
9ea0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9eb0: 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Eq[n-1];.      i
9ec0: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
9ed0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
9ee0: 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20  ==0 && n<nField 
9ef0: 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
9f00: 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
9f10: 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anLt[n-1];.    
9f20: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
9f30: 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31  ;.      res = -1
9f40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9f50: 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65     iSample = iTe
9f60: 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d  st;.      iCol =
9f70: 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77   n-1;.    }.  }w
9f80: 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69  hile( res && iMi
9f90: 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69  n<iSample );.  i
9fa0: 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69   = iSample / nFi
9fb0: 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  eld;..#ifdef SQL
9fc0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
9fd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
9fe0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
9ff0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
a000: 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
a010: 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
a020: 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
a030: 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
a040: 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
a050: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
a060: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
a070: 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
a080: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
a090: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
a0a0: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
a0b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28  ){.      /* If (
a0c0: 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c  res==0) is true,
a0d0: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
a0e0: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70  be equal to samp
a0f0: 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61  le i. */.      a
a100: 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e  ssert( i<pIdx->n
a110: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20  Sample );.      
a120: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
a130: 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20  ield-1 );.      
a140: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
a150: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73  Field;.      ass
a160: 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56  ert( 0==sqlite3V
a170: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
a180: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
a190: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
a1a0: 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  c) .           |
a1b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
a1c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20  llocFailed .    
a1d0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
a1e0: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20        /* Unless 
a1f0: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
a200: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
a210: 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72  t pRec is larger
a220: 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61   than.      ** a
a230: 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
a240: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
a250: 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  y, pRec must be 
a260: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
a270: 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b  .      ** (iCol+
a280: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a290: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f  of sample i.  */
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a2b0: 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  <=pIdx->nSample 
a2c0: 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20  && i>=0 );.     
a2d0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
a2e0: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73  iCol+1;.      as
a2f0: 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
a300: 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
a310: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
a320: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a330: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
a340: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
a350: 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  >0.           ||
a360: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a370: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
a380: 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61      /* if i==0 a
a390: 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  nd iCol==0, then
a3a0: 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   record pRec is 
a3b0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c  smaller than all
a3c0: 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a   samples.      *
a3d0: 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  * in the aSample
a3e0: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
a3f0: 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29  ise, if (iCol>0)
a400: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a   then pRec must.
a410: 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61        ** be grea
a420: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
a430: 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20  l to the (iCol) 
a440: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
a450: 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20  sample i..      
a460: 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65  ** If (i>0), the
a470: 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f  n pRec must also
a480: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
a490: 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20   sample (i-1).  
a4a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  */.      if( iCo
a4b0: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
a4c0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
a4d0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ol;.        asse
a4e0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
a4f0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
a500: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
a510: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d  le[i].p, pRec)<=
a520: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
a530: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
a540: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a550: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a560: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i>0 ){.        p
a570: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
a580: 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73  ield;.        as
a590: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
a5a0: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a5b0: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
a5c0: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
a5d0: 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
a5e0: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
a5f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a610: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
a620: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a630: 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d  G */..  if( res=
a640: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63  =0 ){.    /* Rec
a650: 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61  ord pRec is equa
a660: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f  l to sample i */
a670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
a680: 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20  l==nField-1 );. 
a690: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
a6a0: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
a6b0: 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  ol];.    aStat[1
a6c0: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
a6d0: 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c  nEq[iCol];.  }el
a6e0: 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  se{.    /* At th
a6f0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69  is point, the (i
a700: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
a710: 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69  fix of aSample[i
a720: 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a  ] is the first .
a730: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68      ** sample th
a740: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
a750: 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20  an pRec. Or, if 
a760: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
a770: 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a   then pRec.    *
a780: 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
a790: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
a7a0: 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  the array. */.  
a7b0: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
a7c0: 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
a7d0: 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
a7e0: 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72   ){.      iUpper
a7f0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
a800: 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f  ToInt(pIdx->aiRo
a810: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
a820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
a830: 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  pper = aSample[i
a840: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
a850: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f    }..    if( iLo
a860: 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
a870: 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
a880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a890: 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
a8a0: 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
a8b0: 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
a8c0: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
a8d0: 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
a8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
a8f0: 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
a900: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
a910: 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
a920: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
a930: 78 2d 3e 61 41 76 67 45 71 5b 6e 46 69 65 6c 64  x->aAvgEq[nField
a940: 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  -1];.  }..  /* R
a950: 65 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d  estore the pRec-
a960: 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65  >nField value be
a970: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
a980: 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65   */.  pRec->nFie
a990: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72  ld = nField;.  r
a9a0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69  eturn i;.}.#endi
a9b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
a9c0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
a9d0: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  4 */../*.** If i
a9e0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70  t is not NULL, p
a9f0: 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74  Term is a term t
aa00: 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
aa10: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a  upper or lower.*
aa20: 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e  * bound on a ran
aa30: 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74  ge scan. Without
aa40: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65   considering pTe
aa50: 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  rm, it is estima
aa60: 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ted .** that the
aa70: 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
aa80: 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73   nNew rows. This
aa90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
aaa0: 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
aab0: 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
aac0: 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61  visited after ta
aad0: 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20  king pTerm into 
aae0: 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  account..**.** I
aaf0: 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69  f the user expli
ab00: 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
ab10: 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  a likelihood() v
ab20: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65  alue for this te
ab30: 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  rm,.** then the 
ab40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
ab50: 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d  the likelihood m
ab60: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
ab70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e   number of.** in
ab80: 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77  put rows. Otherw
ab90: 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ise, this functi
aba0: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
abb0: 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  an "IS NOT NULL"
abc0: 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c   term.** has a l
abd0: 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35  ikelihood of 0.5
abe0: 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  0, and any other
abf0: 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f   term a likeliho
ac00: 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73  od of 0.25..*/.s
ac10: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
ac20: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68  reRangeAdjust(Wh
ac30: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
ac40: 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20  LogEst nNew){.  
ac50: 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e  LogEst nRet = nN
ac60: 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  ew;.  if( pTerm 
ac70: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
ac80: 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
ac90: 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20  {.      nRet += 
aca0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
acb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
acc0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
acd0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
ace0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d   ){.      nRet -
acf0: 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
ad00: 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
ad10: 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
ad20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ad30: 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  nRet;.}...#ifdef
ad40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ad50: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
ad60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
ad70: 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69  ffinity for a si
ad80: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ngle column of a
ad90: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72  n index..*/.char
ada0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
adb0: 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69  umnAffinity(sqli
adc0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
add0: 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  pIdx, int iCol){
ade0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
adf0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
ae00: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66  >nColumn );.  if
ae10: 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  ( !pIdx->zColAff
ae20: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
ae30: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
ae40: 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30  Str(db, pIdx)==0
ae50: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ae60: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20  _AFF_BLOB;.  }. 
ae70: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43   return pIdx->zC
ae80: 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23  olAff[iCol];.}.#
ae90: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
aea0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
aeb0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
aec0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
aed0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
aee0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
aef0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
af00: 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
af10: 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
af20: 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
af30: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
af40: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
af50: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
af60: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
af70: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
af80: 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
af90: 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
afa0: 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
afb0: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
afc0: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
afd0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
afe0: 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
aff0: 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
b000: 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
b010: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
b020: 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
b030: 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
b040: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
b050: 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
b060: 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
b070: 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
b080: 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
b090: 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
b0a0: 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
b0b0: 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
b0c0: 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
b0d0: 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
b0e0: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
b0f0: 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
b100: 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
b110: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
b120: 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
b130: 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
b140: 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
b150: 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
b160: 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
b170: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
b180: 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
b190: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
b1a0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
b1b0: 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
b1c0: 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
b1d0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
b1e0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
b1f0: 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
b200: 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
b210: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
b220: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
b230: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
b240: 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
b250: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
b260: 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
b270: 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
b280: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
b290: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
b2a0: 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
b2b0: 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
b2c0: 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
b2d0: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
b2e0: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
b2f0: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
b300: 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
b310: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
b320: 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
b330: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
b340: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
b350: 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
b360: 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
b370: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
b380: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
b390: 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
b3a0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b3b0: 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
b3c0: 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
b3d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b3e0: 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
b3f0: 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
b400: 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
b410: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b420: 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
b430: 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
b440: 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
b450: 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
b460: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
b470: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
b480: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
b490: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
b4a0: 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
b4b0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b4c0: 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
b4d0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
b4e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b4f0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
b500: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
b510: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
b520: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
b530: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
b540: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
b550: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
b560: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
b570: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
b580: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
b590: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
b5a0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
b5b0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
b5c0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
b5d0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
b5e0: 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
b5f0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
b600: 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
b610: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
b620: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
b630: 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
b640: 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
b650: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
b660: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
b670: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
b680: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
b690: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b6a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b6b0: 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
b6c0: 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
b6d0: 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
b6e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b6f0: 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71  K;.  u8 aff = sq
b700: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
b710: 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20  Affinity(db, p, 
b720: 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  nEq);.  CollSeq 
b730: 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c  *pColl;.  .  sql
b740: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d  ite3_value *p1 =
b750: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b760: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b770: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20  from pLower */. 
b780: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b790: 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p2 = 0;         
b7a0: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b7b0: 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20  ted from pUpper 
b7c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b7d0: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20  ue *pVal = 0;   
b7e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b7f0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63  tracted from rec
b800: 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20  ord */..  pColl 
b810: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
b820: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b830: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a  ->azColl[nEq]);.
b840: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
b850: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b860: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b870: 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  pr(pParse, pLowe
b880: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b890: 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20  , aff, &p1);.   
b8a0: 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d   nLower = 0;.  }
b8b0: 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26  .  if( pUpper &&
b8c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b8d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b8e0: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
b8f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70  Expr(pParse, pUp
b900: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
b910: 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20  ht, aff, &p2);. 
b920: 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f     nUpper = p2 ?
b930: 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b   0 : p->nSample;
b940: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c  .  }..  if( p1 |
b950: 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  | p2 ){.    int 
b960: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66  i;.    int nDiff
b970: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
b980: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b990: 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  i<p->nSample; i+
b9a0: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
b9b0: 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d  qlite3Stat4Colum
b9c0: 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  n(db, p->aSample
b9d0: 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c  [i].p, p->aSampl
b9e0: 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56  e[i].n, nEq, &pV
b9f0: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
ba00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ba10: 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p1 ){.        in
ba20: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
ba30: 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56  emCompare(p1, pV
ba40: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
ba50: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
ba60: 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20   nLower++;.     
ba70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
ba80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32  =SQLITE_OK && p2
ba90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
baa0: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
bab0: 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c  Compare(p2, pVal
bac0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
bad0: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
bae0: 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Upper++;.      }
baf0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66  .    }.    nDiff
bb00: 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f   = (nUpper - nLo
bb10: 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  wer);.    if( nD
bb20: 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d  iff<=0 ) nDiff =
bb30: 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   1;..    /* If t
bb40: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
bb50: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
bb60: 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c  bound specified,
bb70: 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
bb80: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64   comparisons ind
bb90: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20  icate that they 
bba0: 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  are close togeth
bbb0: 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c  er, use the fall
bbc0: 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68  back.    ** meth
bbd0: 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20  od (assume that 
bbe0: 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20  the scan visits 
bbf0: 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73  1/64 of the rows
bc00: 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  ) for estimating
bc10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
bc20: 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
bc30: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  ed. Otherwise, e
bc40: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
bc50: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a  er of rows.    *
bc60: 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68  * using the meth
bc70: 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  od described in 
bc80: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
bc90: 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  nt for this func
bca0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
bcb0: 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70   nDiff!=1 || pUp
bcc0: 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72  per==0 || pLower
bcd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
bce0: 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69   nAdjust = (sqli
bcf0: 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61  te3LogEst(p->nSa
bd00: 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c  mple) - sqlite3L
bd10: 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20  ogEst(nDiff));. 
bd20: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
bd30: 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20   -= nAdjust;.   
bd40: 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a     *pbDone = 1;.
bd50: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
bd60: 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73  (0x10, ("range s
bd70: 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73  kip-scan regions
bd80: 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74  : %u..%u  adjust
bd90: 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  =%d est=%d\n",. 
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72            nLower
bdc0: 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73  , nUpper, nAdjus
bdd0: 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  t*-1, pLoop->nOu
bde0: 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  t));.    }..  }e
bdf0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
be00: 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20   *pbDone==0 );. 
be10: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
be20: 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71  ueFree(p1);.  sq
be30: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
be40: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  2);.  sqlite3Val
be50: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
be60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
be70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
be80: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
be90: 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
bea0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
beb0: 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
bec0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
bed0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
bee0: 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
bef0: 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
bf00: 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
bf10: 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
bf20: 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
bf30: 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
bf40: 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
bf50: 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
bf60: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
bf70: 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
bf80: 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
bf90: 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
bfa0: 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
bfb0: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
bfc0: 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
bfd0: 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
bfe0: 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
bff0: 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
c000: 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
c010: 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
c020: 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
c040: 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
c050: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c060: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
c070: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
c080: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
c090: 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
c0a0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
c0b0: 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
c0c0: 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
c0d0: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
c0e0: 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
c0f0: 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
c100: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
c110: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
c120: 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
c130: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
c140: 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
c150: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
c160: 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73  ndex.** column s
c170: 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61  ubject to the ra
c180: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
c190: 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
c1a0: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  , the number of.
c1b0: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
c1c0: 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65  traints optimize
c1d0: 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
c1e0: 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
c1f0: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73  r example,.** as
c200: 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69  suming index p i
c210: 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  s on t1(a, b), a
c220: 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
c230: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
c240: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
c250: 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
c260: 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
c270: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
c280: 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20  et to 1 (as the 
c290: 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64  range restricted
c2a0: 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74   column, b, is t
c2b0: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65  he second .** le
c2c0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
c2d0: 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
c2e0: 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
c2f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
c300: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
c310: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
c320: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
c330: 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a  is set to 0..**.
c340: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
c350: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
c360: 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74   *pnOut is set t
c370: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67  o the sqlite3Log
c380: 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20  Est() of the.** 
c390: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
c3a0: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63  hat the index sc
c3b0: 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74  an is expected t
c3c0: 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20  o visit without 
c3d0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  .** considering 
c3e0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
c3f0: 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73  aints. If nEq is
c400: 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20   0, then *pnOut 
c410: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c420: 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65   .** rows in the
c430: 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67   index. Assuming
c440: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c450: 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75  , *pnOut is adju
c460: 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a  sted (reduced).*
c470: 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  * to account for
c480: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
c490: 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e  raints pLower an
c4a0: 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a  d pUpper..** .**
c4b0: 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
c4c0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  of sqlite_stat4 
c4d0: 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72  ANALYZE data, or
c4e0: 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61   if such data ca
c4f0: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
c500: 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20   a single range 
c510: 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63  inequality reduc
c520: 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
c530: 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
c540: 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20  of 4. .** and a 
c550: 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  pair of constrai
c560: 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  nts (x>? AND x<?
c570: 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78  ) reduces the ex
c580: 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
c590: 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64  .** rows visited
c5a0: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c5b0: 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  64..*/.static in
c5c0: 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
c5d0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
c5e0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
c5f0: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
c600: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
c610: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
c620: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
c630: 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ,.  WhereTerm *p
c640: 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
c650: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c660: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
c670: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c680: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c690: 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
c6a0: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
c6b0: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
c6c0: 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
c6d0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
c6e0: 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f  *pLoop     /* Mo
c6f0: 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61  dify the .nOut a
c700: 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66  nd maybe .rRun f
c710: 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ields */.){.  in
c720: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c730: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70  ;.  int nOut = p
c740: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f  Loop->nOut;.  Lo
c750: 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  gEst nNew;..#ifd
c760: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c770: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
c780: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
c790: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
c7a0: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
c7b0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c7c0: 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  Eq;..  if( p->nS
c7d0: 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70  ample>0 && nEq<p
c7e0: 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a  ->nSampleCol ){.
c7f0: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75      if( nEq==pBu
c800: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c810: 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b   ){.      Unpack
c820: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
c830: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
c840: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61  .      tRowcnt a
c850: 5b 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  [2];.      int n
c860: 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Btm = pLoop->u.b
c870: 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20  tree.nBtm;.     
c880: 20 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f   int nTop = pLoo
c890: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b  p->u.btree.nTop;
c8a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
c8b0: 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
c8c0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
c8d0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
c8e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
c8f0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
c900: 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
c910: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
c920: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
c930: 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
c940: 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
c950: 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
c960: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
c970: 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
c980: 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
c990: 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
c9a0: 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
c9b0: 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
c9c0: 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
c9d0: 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
c9e0: 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
c9f0: 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
ca00: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
ca10: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
ca20: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
ca30: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
ca40: 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
ca50: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
ca60: 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
ca70: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
ca80: 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
ca90: 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
caa0: 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
cab0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
cac0: 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
cad0: 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
cae0: 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
caf0: 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
cb00: 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
cb10: 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
cb20: 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
cb30: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
cb40: 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
cb50: 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
cb60: 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
cb70: 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
cb80: 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65  ed values is use
cb90: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
cba0: 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
cbb0: 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
cbc0: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
cbd0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
cbe0: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
cbf0: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
cc00: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
cc10: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
cc20: 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
cc30: 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
cc40: 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
cc50: 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
cc60: 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
cc70: 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
cc80: 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
cc90: 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
cca0: 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
ccb0: 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
ccc0: 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
ccd0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
cce0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
ccf0: 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68   rows between th
cd00: 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20  e two bounds is 
cd10: 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72  then just iUpper
cd20: 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a  -iLower..      *
cd30: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
cd40: 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52  iLower;     /* R
cd50: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
cd60: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
cd70: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
cd80: 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Upper;     /* Ro
cd90: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
cda0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
cdb0: 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64        int iLwrId
cdc0: 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61  x = -2;   /* aSa
cdd0: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c  mple[] for the l
cde0: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
cdf0: 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20      int iUprIdx 
ce00: 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -1;   /* aSamp
ce10: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70  le[] for the upp
ce20: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20  er bound */..   
ce30: 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20     if( pRec ){. 
ce40: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
ce50: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70   pRec->nField!=p
ce60: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
ce70: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  id );.        pR
ce80: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75  ec->nField = pBu
ce90: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
cea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ceb0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
cec0: 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
ced0: 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
cee0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  */.      if( nEq
cef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
cf00: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
cf10: 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e     iUpper = p->n
cf20: 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d  RowEst0;.      }
cf30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
cf40: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
cf50: 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
cf60: 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
cf70: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
cf80: 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a   must .        *
cf90: 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  * have been requ
cfa0: 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69  ested when testi
cfb0: 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65  ng key $P in whe
cfc0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29  reEqualScanEst()
cfd0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
cfe0: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
cff0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
d000: 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77  a);.        iLow
d010: 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
d020: 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
d030: 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   + a[1];.      }
d040: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
d050: 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c  pLower==0 || (pL
d060: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
d070: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
d080: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
d090: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d0a0: 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  | (pUpper->eOper
d0b0: 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
d0c0: 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
d0d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f    assert( p->aSo
d0e0: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
d0f0: 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74      if( p->aSort
d100: 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20  Order[nEq] ){.  
d110: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c        /* The rol
d120: 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64  es of pLower and
d130: 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70   pUpper are swap
d140: 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69  ped for a DESC i
d150: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
d160: 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c  SWAP(WhereTerm*,
d170: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29   pLower, pUpper)
d180: 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69  ;.        SWAP(i
d190: 6e 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b  nt, nBtm, nTop);
d1a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d1b0: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
d1c0: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
d1d0: 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75  Lower estimate u
d1e0: 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f  sing ($P:$L). */
d1f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65  .      if( pLowe
d200: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
d210: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
d220: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73         /* Values
d230: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
d240: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
d250: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
d260: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
d270: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
d280: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
d290: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
d2a0: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
d2b0: 45 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c  Expr, nBtm, nEq,
d2c0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66   &n);.        if
d2d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d2e0: 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  && n ){.        
d2f0: 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
d300: 20 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61            u16 ma
d310: 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45  sk = WO_GT|WO_LE
d320: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d330: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d340: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29  rSize(pExpr)>n )
d350: 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57   mask = (WO_LE|W
d360: 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20  O_LT);.         
d370: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
d380: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
d390: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
d3a0: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
d3b0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
d3c0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d  r->eOperator & m
d3d0: 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  ask) ? a[1] : 0)
d3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d3f0: 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
d400: 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
d410: 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20         nOut--;. 
d420: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
d430: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
d440: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d450: 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
d460: 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70  prove on the iUp
d470: 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  per estimate usi
d480: 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20  ng ($P:$U). */. 
d490: 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
d4a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
d4b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d4c0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65       /* Values e
d4d0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
d4e0: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
d4f0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
d500: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
d510: 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
d520: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
d530: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
d540: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
d550: 70 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26  pr, nTop, nEq, &
d560: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
d570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d580: 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   n ){.          
d590: 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
d5a0: 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b          u16 mask
d5b0: 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a   = WO_GT|WO_LE;.
d5c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
d5d0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
d5e0: 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d  ize(pExpr)>n ) m
d5f0: 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f  ask = (WO_LE|WO_
d600: 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  LT);.          i
d610: 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
d620: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
d630: 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
d640: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
d650: 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
d660: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73  >eOperator & mas
d670: 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  k) ? a[1] : 0);.
d680: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
d690: 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
d6a0: 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
d6b0: 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
d6c0: 20 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20         pUpper = 
d6d0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d6e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69     }..      pBui
d6f0: 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
d700: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  c;.      if( rc=
d710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d720: 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
d730: 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20  >iLower ){.     
d740: 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69       nNew = sqli
d750: 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72  te3LogEst(iUpper
d760: 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - iLower);.    
d770: 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
d780: 20 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72    If both iUpper
d790: 20 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20   and iLower are 
d7a0: 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65  derived from the
d7b0: 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
d7c0: 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ** sample, then 
d7d0: 61 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20  assume they are 
d7e0: 34 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  4x more selectiv
d7f0: 65 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a  e.  This brings.
d800: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
d810: 20 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63   estimated selec
d820: 74 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c  tivity more in l
d830: 69 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74  ine with what it
d840: 20 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20   would be.      
d850: 20 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61      ** if estima
d860: 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  ted without the 
d870: 75 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74  use of STAT3/4 t
d880: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ables. */.      
d890: 20 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d      if( iLwrIdx=
d8a0: 3d 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20  =iUprIdx ) nNew 
d8b0: 2d 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20  -= 20;  assert( 
d8c0: 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
d8d0: 74 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(4) );.        
d8e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d8f0: 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20   nNew = 10;     
d900: 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73     assert( 10==s
d910: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
d920: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d930: 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
d940: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
d950: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  nOut = nNew;.   
d960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57       }.        W
d970: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20  HERETRACE(0x10, 
d980: 28 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63  ("STAT4 range sc
d990: 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d  an: %u..%u  est=
d9a0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28    (u32)iLower, (
d9d0: 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74  u32)iUpper, nOut
d9e0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
d9f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
da00: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20   bDone = 0;.    
da10: 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
da20: 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61  eSkipScanEst(pPa
da30: 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rse, pLower, pUp
da40: 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f  per, pLoop, &bDo
da50: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ne);.      if( b
da60: 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63  Done ) return rc
da70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
da80: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
da90: 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
daa0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
dab0: 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73  (pBuilder);.  as
dac0: 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
dad0: 70 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66  pUpper );.#endif
dae0: 0a 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65  .  assert( pUppe
daf0: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
db00: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
db10: 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e  VNULL)==0 );.  n
db20: 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65  New = whereRange
db30: 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e  Adjust(pLower, n
db40: 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  Out);.  nNew = w
db50: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
db60: 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a  pUpper, nNew);..
db70: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
db80: 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
db90: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
dba0: 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68   limit and neith
dbb0: 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61  er limit.  ** ha
dbc0: 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  s an application
dbd0: 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68  -defined likelih
dbe0: 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68  ood(), assume th
dbf0: 65 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20  e range is.  ** 
dc00: 72 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64  reduced by an ad
dc10: 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68  ditional 75%. Th
dc20: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62  is means that, b
dc30: 79 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70  y default, an op
dc40: 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61  en-ended.  ** ra
dc50: 6e 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20  nge query (e.g. 
dc60: 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75  col > ?) is assu
dc70: 6d 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34  med to match 1/4
dc80: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20   of the rows in 
dc90: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20  the.  ** index. 
dca0: 57 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72  While a closed r
dcb0: 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42  ange (e.g. col B
dcc0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20  ETWEEN ? AND ?) 
dcd0: 69 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a  is estimated to.
dce0: 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20    ** match 1/64 
dcf0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f  of the index. */
dd00: 20 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26   .  if( pLower &
dd10: 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50  & pLower->truthP
dd20: 72 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20  rob>0 && pUpper 
dd30: 26 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68  && pUpper->truth
dd40: 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e  Prob>0 ){.    nN
dd50: 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20  ew -= 20;.  }.. 
dd60: 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
dd70: 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
dd80: 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
dd90: 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
dda0: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
ddb0: 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69   nOut = nNew;.#i
ddc0: 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
ddd0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20  RACE_ENABLED).  
dde0: 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e  if( pLoop->nOut>
ddf0: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52  nOut ){.    WHER
de00: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61  ETRACE(0x10,("Ra
de10: 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20  nge scan lowers 
de20: 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20  nOut from %d to 
de30: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
de40: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
de50: 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a  ->nOut, nOut));.
de60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f    }.#endif.  pLo
de70: 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
de80: 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72  st)nOut;.  retur
de90: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
dea0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
deb0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
dec0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
ded0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
dee0: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
def0: 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
df00: 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
df10: 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
df20: 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
df30: 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
df40: 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
df50: 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
df60: 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
df70: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
df80: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
df90: 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
dfa0: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
dfb0: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
dfc0: 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
dfd0: 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
dfe0: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
dff0: 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
e000: 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
e010: 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
e020: 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
e030: 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
e040: 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
e050: 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
e060: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
e070: 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
e080: 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
e090: 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
e0a0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
e0b0: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
e0c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e0d0: 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
e0e0: 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
e0f0: 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
e100: 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
e110: 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
e120: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
e130: 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
e140: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
e150: 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
e160: 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
e170: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
e180: 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
e190: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
e1a0: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
e1b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
e1c0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
e1d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e1e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e1f0: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
e200: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e210: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
e220: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
e230: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
e240: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
e250: 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
e260: 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
e270: 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63  raint */.  tRowc
e280: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
e290: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
e2a0: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
e2b0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
e2c0: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
e2d0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
e2e0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
e2f0: 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nEq = pBuilder->
e300: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
e310: 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  q;.  UnpackedRec
e320: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
e330: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e  lder->pRec;.  in
e340: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
e350: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
e360: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
e370: 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
e380: 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
e390: 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
e3a0: 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
e3b0: 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
e3c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
e3d0: 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
e3e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
e3f0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
e400: 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
e410: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e420: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e430: 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
e440: 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
e450: 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
e460: 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
e470: 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
e480: 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
e490: 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
e4a0: 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
e4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e4c0: 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
e4d0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e4e0: 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
e4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e500: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
e510: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
e520: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
e530: 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
e540: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
e550: 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
e560: 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
e570: 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
e580: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
e590: 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
e5a0: 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
e5b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e5c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
e5d0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
e5e0: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
e5f0: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
e600: 78 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26  xpr, 1, nEq-1, &
e610: 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
e620: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
e630: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e640: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e650: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
e660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e670: 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
e680: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
e690: 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
e6a0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
e6b0: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
e6c0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
e6d0: 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
e6e0: 65 67 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25  egions %s(%d): %
e6f0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
e700: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
e710: 65 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61  e, nEq-1, (int)a
e720: 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
e730: 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
e740: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e750: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e760: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e770: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
e780: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e790: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
e7a0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
e7b0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
e7c0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
e7d0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
e7e0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
e7f0: 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
e800: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
e810: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
e820: 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
e830: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
e840: 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
e850: 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
e860: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
e870: 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
e880: 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
e890: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e8a0: 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
e8b0: 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
e8c0: 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
e8d0: 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
e8e0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
e8f0: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
e900: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
e910: 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
e920: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
e930: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
e940: 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
e950: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
e960: 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
e970: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
e980: 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
e990: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
e9a0: 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
e9b0: 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
e9c0: 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
e9d0: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
e9e0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
e9f0: 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
ea00: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ea10: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
ea20: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
ea30: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
ea40: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
ea50: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
ea60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
ea70: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
ea80: 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
ea90: 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
eaa0: 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
eab0: 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
eac0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ead0: 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
eae0: 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
eaf0: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
eb00: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
eb10: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
eb20: 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73  .  i64 nRow0 = s
eb30: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
eb40: 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  t(p->aiRowLogEst
eb50: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63  [0]);.  int nRec
eb60: 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
eb70: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
eb80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
eb90: 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
eba0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
ebb0: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
ebc0: 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
ebd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
ebe0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
ebf0: 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
ec00: 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
ec10: 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
ec20: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
ec30: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
ec40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ec50: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ec60: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
ec70: 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
ec80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
ec90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
eca0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
ecb0: 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e  +){.    nEst = n
ecc0: 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77  Row0;.    rc = w
ecd0: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
ece0: 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
ecf0: 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r, pList->a[i].p
ed00: 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
ed10: 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
ed20: 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  t;.    pBuilder-
ed30: 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
ed40: 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69  cValid;.  }..  i
ed50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ed60: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
ed70: 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52  Est > nRow0 ) nR
ed80: 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20  owEst = nRow0;. 
ed90: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
eda0: 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
edb0: 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
edc0: 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
edd0: 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %d\n", nRowEst))
ede0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
edf0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
ee00: 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
ee10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ee20: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ee30: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
ee40: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66  R_STAT4 */...#if
ee50: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
ee60: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
ee70: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
ee80: 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
ee90: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
eea0: 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
eeb0: 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
eec0: 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
eed0: 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
eee0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
eef0: 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
ef00: 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
ef10: 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
ef20: 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
ef30: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74  ;.    char zLeft
ef40: 5b 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  [50];.    memcpy
ef50: 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
ef60: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
ef70: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
ef80: 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
ef90: 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69  [0] = 'V';.    i
efa0: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
efb0: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20  tor & WO_EQUIV  
efc0: 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27  ) zType[1] = 'E'
efd0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
efe0: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
eff0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
f000: 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20  oin) ) zType[2] 
f010: 3d 20 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'L';.    if( p
f020: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f030: 26 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20  & WO_SINGLE ){. 
f040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
f050: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
f060: 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d  ft),zLeft,"left=
f070: 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
f0a0: 6f 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  or, pTerm->u.lef
f0b0: 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65  tColumn);.    }e
f0c0: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
f0d0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
f0e0: 52 29 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e  R)!=0 && pTerm->
f0f0: 75 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a  u.pOrInfo!=0 ){.
f100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f110: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
f120: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65  eft),zLeft,"inde
f130: 78 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a  xable=0x%lld", .
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e         pTerm->u.
f160: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
f170: 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
f180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f190: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
f1a0: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74  eft),zLeft,"left
f1b0: 3d 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66  =%d", pTerm->lef
f1c0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  tCursor);.    }.
f1d0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f1e0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
f1f0: 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20  TERM-%-3d %p %s 
f200: 25 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20  %-12s prob=%-3d 
f210: 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67  op=0x%03x wtFlag
f220: 73 3d 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20  s=0x%04x",.     
f230: 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20    iTerm, pTerm, 
f240: 7a 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54  zType, zLeft, pT
f250: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
f260: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
f270: 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e  perator, pTerm->
f280: 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  wtFlags);.    if
f290: 28 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20  ( pTerm->iField 
f2a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f2b0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 69 46  DebugPrintf(" iF
f2c0: 69 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72  ield=%d\n", pTer
f2d0: 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  m->iField);.    
f2e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f2f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f300: 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
f310: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
f320: 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70  Expr(0, pTerm->p
f330: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  Expr, 0);.  }.}.
f340: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
f350: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
f360: 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65  D./*.** Show the
f370: 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
f380: 74 20 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75  t of a WhereClau
f390: 73 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  se.*/.void sqlit
f3a0: 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
f3b0: 6e 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  nt(WhereClause *
f3c0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
f3d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d   for(i=0; i<pWC-
f3e0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
f3f0: 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
f400: 28 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  (&pWC->a[i], i);
f410: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
f420: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
f430: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
f440: 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70  rint a WhereLoop
f450: 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75   object for debu
f460: 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  gging purposes.*
f470: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f480: 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65  ereLoopPrint(Whe
f490: 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
f4a0: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
f4b0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
f4c0: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
f4d0: 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
f4e0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
f4f0: 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74  >nSrc+3)/4;.  st
f500: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
f510: 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  m *pItem = pWInf
f520: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
f530: 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
f540: 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
f550: 3e 70 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b  >pTab;.  Bitmask
f560: 20 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61   mAll = (((Bitma
f570: 73 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d  sk)1)<<(nb*4)) -
f580: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62   1;.  sqlite3Deb
f590: 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
f5a0: 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
f5b0: 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f5d0: 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
f5e0: 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
f5f0: 65 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20  ereq & mAll);.  
f600: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f610: 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
f640: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
f650: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
f660: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
f670: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
f680: 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
f690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
f6a0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  me;.    if( p->u
f6b0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26  .btree.pIndex &&
f6c0: 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   (zName = p->u.b
f6d0: 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
f6e0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
f6f0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  if( strncmp(zNam
f700: 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
f710: 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29  ndex_", 17)==0 )
f720: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
f730: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
f740: 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20  0(zName) - 1;.  
f750: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61        while( zNa
f760: 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d  me[i]!='_' ) i--
f770: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
f780: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
f790: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f7a0: 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25  Printf(".%-16s %
f7b0: 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75  2d", zName, p->u
f7c0: 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20  .btree.nEq);.   
f7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f7e0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f7f0: 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20  ("%20s","");.   
f800: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f810: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
f820: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
f830: 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  r ){.      z = s
f840: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f850: 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c  (%d,\"%s\",%x)",
f860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f870: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f880: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  m, p->u.vtab.idx
f890: 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Str, p->u.vtab.o
f8a0: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65  mitMask);.    }e
f8b0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
f8c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f8d0: 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76  (%d,%x)", p->u.v
f8e0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
f8f0: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f900: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f910: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f920: 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20  %-19s", z);.    
f930: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
f940: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73  .  }.  if( p->ws
f950: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
f960: 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71  IPSCAN ){.    sq
f970: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f980: 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22  (" f %05x %d-%d"
f990: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
f9a0: 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70  >nLTerm,p->nSkip
f9b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f9c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f9d0: 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64  tf(" f %05x N %d
f9e0: 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
f9f0: 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20  ->nLTerm);.  }. 
fa00: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
fa10: 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64  ntf(" cost %d,%d
fa20: 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75  ,%d\n", p->rSetu
fa30: 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  p, p->rRun, p->n
fa40: 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  Out);.  if( p->n
fa50: 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65  LTerm && (sqlite
fa60: 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
fa70: 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  100)!=0 ){.    i
fa80: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
fa90: 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20  0; i<p->nLTerm; 
faa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
fab0: 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c  eTermPrint(p->aL
fac0: 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20  Term[i], i);.   
fad0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
fae0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
faf0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
fb00: 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
fb10: 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
fb20: 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
fb30: 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
fb40: 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
fb50: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
fb60: 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
fb70: 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
fb80: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
fb90: 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
fba0: 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
fbb0: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
fbc0: 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
fbd0: 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
fbe0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
fbf0: 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
fc00: 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
fc10: 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
fc20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fc30: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
fc40: 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
fc50: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
fc60: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
fc70: 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
fc80: 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55  ALTABLE|WHERE_AU
fc90: 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  TO_INDEX) ){.   
fca0: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
fcb0: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fcc0: 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
fcd0: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
fce0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fcf0: 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
fd00: 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
fd10: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
fd20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
fd30: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
fd40: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
fd50: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
fd60: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
fd70: 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
fd80: 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
fd90: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fda0: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
fdb0: 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
fdc0: 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
fdd0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
fde0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
fdf0: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
fe00: 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
fe10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
fe20: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
fe30: 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
fe40: 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
fe50: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
fe60: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
fe70: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
fe80: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
fe90: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
fea0: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
feb0: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
fec0: 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  eNN(db, p->aLTer
fed0: 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
fee0: 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
fef0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
ff00: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
ff10: 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
ff20: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
ff30: 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
ff40: 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
ff50: 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
ff60: 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
ff70: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
ff80: 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
ff90: 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
ffa0: 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
ffb0: 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
ffc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ffd0: 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
ffe0: 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
fff0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
10000 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
10010 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
10020 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
10030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10040 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
10050 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
10060 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
10070 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
10080 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
10090 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
100a0 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
100b0 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54  reeNN(db, p->aLT
100c0 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
100d0 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
100e0 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
100f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10100 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
10110 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
10120 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
10130 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
10140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
10150 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
10160 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
10170 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
10180 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68  op *pFrom){.  wh
10190 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
101a0 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66  n(db, pTo);.  if
101b0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
101c0 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
101d0 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20  ->nLTerm) ){.   
101e0 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c   memset(&pTo->u,
101f0 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e   0, sizeof(pTo->
10200 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  u));.    return 
10210 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
10220 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  T;.  }.  memcpy(
10230 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
10240 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
10250 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
10260 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
10270 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
10280 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
10290 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
102a0 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
102b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
102c0 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
102d0 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
102e0 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
102f0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
10300 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
10310 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
10320 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
10330 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
10340 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10350 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
10360 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
10370 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
10380 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
10390 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
103a0 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
103b0 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
103c0 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
103d0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
103e0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
103f0 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
10400 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
10410 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
10420 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
10430 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
10440 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
10450 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
10460 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10470 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
10480 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
10490 20 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c        WhereLevel
104a0 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e   *pLevel = &pWIn
104b0 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  fo->a[i];.      
104c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
104d0 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
104e0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
104f0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10500 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10510 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
10520 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
10530 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
10540 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  }.    sqlite3Whe
10550 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
10560 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20  WInfo->sWC);.   
10570 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
10580 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20  pLoops ){.      
10590 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
105a0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
105b0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f       pWInfo->pLo
105c0 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ops = p->pNextLo
105d0 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
105e0 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
105f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10600 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
10610 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
10620 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10630 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  E if all of the 
10640 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
10650 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
10660 20 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20   X has the same 
10670 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
10680 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58  at Y.**   (2)  X
10690 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
106a0 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33  set of Y.**   (3
106b0 29 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65  )  X skips at le
106c0 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75  ast as many colu
106d0 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42  mns as Y.**.** B
106e0 79 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74  y "proper subset
106f0 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58  " we mean that X
10700 20 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52   uses fewer WHER
10710 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a  E clause terms.*
10720 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61  * than Y and tha
10730 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  t every WHERE cl
10740 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62  ause term used b
10750 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64  y X is also used
10760 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20  .** by Y..**.** 
10770 49 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  If X is a proper
10780 20 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65   subset of Y the
10790 6e 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20  n Y is a better 
107a0 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74  choice and ought
107b0 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f  .** to have a lo
107c0 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20  wer cost.  This 
107d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
107e0 54 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63  TRUE when that c
107f0 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e  ost .** relation
10800 73 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64  ship is inverted
10810 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
10820 20 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20   adjusted.  The 
10830 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61  third rule.** wa
10840 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20  s added because 
10850 69 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73  if X uses skip-s
10860 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20  can less than Y 
10870 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a  it still might.*
10880 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65  * deserve a lowe
10890 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69  r cost even if i
108a0 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  t is a proper su
108b0 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74  bset of Y..*/.st
108c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
108d0 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
108e0 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57  ubset(.  const W
108f0 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20  hereLoop *pX,   
10900 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65      /* First Whe
10910 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72  reLoop to compar
10920 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65  e */.  const Whe
10930 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20  reLoop *pY      
10940 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61    /* Compare aga
10950 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c  inst this WhereL
10960 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
10970 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e  i, j;.  if( pX->
10980 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70  nLTerm-pX->nSkip
10990 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70   >= pY->nLTerm-p
109a0 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  Y->nSkip ){.    
109b0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69  return 0; /* X i
109c0 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  s not a subset o
109d0 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  f Y */.  }.  if(
109e0 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d   pY->nSkip > pX-
109f0 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20  >nSkip ) return 
10a00 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  0;.  if( pX->rRu
10a10 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
10a20 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
10a30 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
10a40 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
10a50 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10a60 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
10a70 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
10a80 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
10a90 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
10aa0 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
10ab0 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
10ac0 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
10ad0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
10ae0 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
10af0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
10b00 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
10b10 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
10b20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
10b30 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
10b40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
10b50 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
10b60 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
10b70 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
10b80 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
10b90 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
10ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
10bb0 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
10bc0 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
10bd0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
10be0 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
10bf0 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
10c00 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
10c10 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
10c20 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
10c30 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
10c40 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
10c50 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
10c60 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
10c70 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
10c80 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
10c90 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
10ca0 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
10cb0 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
10cc0 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
10cd0 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
10ce0 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
10cf0 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
10d00 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
10d10 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
10d20 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
10d30 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
10d40 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
10d50 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
10d60 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
10d70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
10d80 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
10d90 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
10da0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
10db0 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
10dc0 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
10dd0 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
10de0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
10df0 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
10e00 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
10e10 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
10e20 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
10e30 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
10e40 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
10e50 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
10e60 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
10e70 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
10e80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
10e90 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
10ea0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
10eb0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
10ec0 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
10ed0 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
10ee0 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
10ef0 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
10f00 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
10f10 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
10f20 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
10f30 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20  set p. */.      
10f40 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
10f50 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
10f60 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
10f70 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
10fa0 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
10fb0 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
10fc0 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20  >nOut-1));.     
10fd0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
10fe0 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
10ff0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
11000 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
11010 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
11020 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
11030 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
11040 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
11050 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
11060 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
11070 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
11080 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
11090 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
110a0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
110b0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
110c0 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  p */.      WHERE
110d0 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
110e0 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
110f0 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
11100 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
11120 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
11130 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
11140 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
11150 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  +1));.      pTem
11160 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
11170 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
11180 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
11190 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20  ->nOut + 1;.    
111a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
111b0 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f  earch the list o
111c0 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20  f WhereLoops in 
111d0 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20  *ppPrev looking 
111e0 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e  for one that can
111f0 20 62 65 0a 2a 2a 20 72 65 70 6c 61 63 65 64 20   be.** replaced 
11200 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a  by pTemplate..**
11210 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
11220 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65  if pTemplate doe
11230 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20  s not belong on 
11240 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
11250 73 74 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  st..** In other 
11260 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
11270 74 65 20 6f 75 67 68 74 20 74 6f 20 62 65 20 64  te ought to be d
11280 72 6f 70 70 65 64 20 66 72 6f 6d 20 66 75 72 74  ropped from furt
11290 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
112a0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69  n..**.** If pX i
112b0 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  s a WhereLoop th
112c0 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  at pTemplate can
112d0 20 72 65 70 6c 61 63 65 2c 20 74 68 65 6e 20 72   replace, then r
112e0 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
112f0 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
11300 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
11310 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 72  emplate cannot r
11320 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
11330 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
11340 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64  he list but need
11350 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64  s.** to be added
11360 20 74 6f 20 74 68 65 20 6c 69 73 74 20 61 73 20   to the list as 
11370 61 20 6e 65 77 20 65 6e 74 72 79 2c 20 74 68 65  a new entry, the
11380 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
11390 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 69  er to the.** tai
113a0 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  l of the list..*
113b0 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f  /.static WhereLo
113c0 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69  op **whereLoopFi
113d0 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72  ndLesser(.  Wher
113e0 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a  eLoop **ppPrev,.
113f0 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
11400 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a  p *pTemplate.){.
11410 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
11420 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76    for(p=(*ppPrev
11430 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  ); p; ppPrev=&p-
11440 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
11450 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
11460 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
11470 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
11480 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
11490 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
114a0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
114b0 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
114c0 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
114d0 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
114e0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
114f0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
11500 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
11510 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
11520 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
11530 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
11540 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
11550 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
11560 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
11570 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
11580 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
11590 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
115a0 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
115b0 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
115c0 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
115d0 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
115e0 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
115f0 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
11600 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
11610 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
11620 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
11630 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
11640 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11650 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
11660 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
11670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11680 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
11690 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
116a0 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
116b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
116c0 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
116d0 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
116e0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
116f0 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
11700 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
11710 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
11720 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
11730 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
11740 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
11750 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
11760 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
11770 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11780 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
11790 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
117a0 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61  Any loop using a
117b0 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66  n appliation-def
117c0 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50  ined index (or P
117d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20  RIMARY KEY or.  
117e0 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73    ** UNIQUE cons
117f0 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65  traint) with one
11800 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73   or more == cons
11810 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65  traints is bette
11820 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e  r.    ** than an
11830 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11840 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61  . Unless it is a
11850 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20   skip-scan. */. 
11860 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
11870 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
11880 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26  INDEX)!=0.     &
11890 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  & (pTemplate->nS
118a0 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  kip)==0.     && 
118b0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
118c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
118d0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20  XED)!=0.     && 
118e0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
118f0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
11900 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26  MN_EQ)!=0.     &
11910 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
11920 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
11930 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
11940 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20  ereq.    ){.    
11950 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11960 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69      /* If existi
11970 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  ng WhereLoop p i
11980 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54  s better than pT
11990 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61  emplate, pTempla
119a0 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  te can be.    **
119b0 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65   discarded.  Whe
119c0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
119d0 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20  er if:.    **   
119e0 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f  (1)  p has no mo
119f0 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  re dependencies 
11a00 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
11a10 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
11a20 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c    p has an equal
11a30 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11a40 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  han pTemplate.  
11a50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
11a60 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
11a70 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
11a80 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31  >prereq    /* (1
11a90 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
11aa0 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
11ab0 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20  te->rSetup      
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
11ad0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
11ae0 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
11af0 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b10 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2b) */.     && 
11b20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61  p->nOut<=pTempla
11b30 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b50 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2c) */.    ){.
11b60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
11b70 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d   /* Discard pTem
11b80 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a  plate */.    }..
11b90 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c      /* If pTempl
11ba0 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65  ate is always be
11bb0 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65  tter than p, the
11bc0 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20  n cause p to be 
11bd0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20  overwritten.    
11be0 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
11bf0 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  e.  pTemplate is
11c00 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69   better than p i
11c10 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
11c20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e   pTemplate has n
11c30 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
11c40 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20  es than p, and. 
11c50 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65     **   (2)  pTe
11c60 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71  mplate has an eq
11c70 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
11c80 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f  t than p..    */
11c90 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
11ca0 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
11cb0 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
11cc0 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a  ate->prereq   /*
11cd0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
11ce0 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
11cf0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
11d20 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
11d30 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
11d40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d60 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2b) */.    ){.
11d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11d80 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
11d90 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a  te->rSetup ); /*
11da0 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
11db0 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
11dc0 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73  break;   /* Caus
11dd0 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
11de0 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61  itten by pTempla
11df0 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  te */.    }.  }.
11e00 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b    return ppPrev;
11e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
11e20 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68   or replace a Wh
11e30 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73  ereLoop entry us
11e40 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
11e50 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a   supplied..**.**
11e60 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   An existing Whe
11e70 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67  reLoop entry mig
11e80 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ht be overwritte
11e90 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d  n if the new tem
11ea0 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74  plate.** is bett
11eb0 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72  er and has fewer
11ec0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20   dependencies.  
11ed0 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  Or the template 
11ee0 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a  will be ignored.
11ef0 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74  ** and no insert
11f00 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61   will occur if a
11f10 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
11f20 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61  Loop is faster a
11f30 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20  nd has.** fewer 
11f40 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
11f50 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20  n the template. 
11f60 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77   Otherwise a new
11f70 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a   WhereLoop is.**
11f80 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20   added based on 
11f90 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  the template..**
11fa0 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
11fb0 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e  >pOrSet is not N
11fc0 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65  ULL then we care
11fd0 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
11fe0 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
11ff0 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
12000 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
12010 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
12020 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
12030 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
12040 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
12050 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
12060 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
12070 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
12080 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
12090 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
120a0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
120b0 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
120c0 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
120d0 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
120e0 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
120f0 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
12100 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
12110 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
12120 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
12130 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70   the.** new temp
12140 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
12150 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
12160 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
12170 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
12180 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
12190 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
121a0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
121b0 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
121c0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
121d0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
121e0 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
121f0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
12200 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
12210 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
12220 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
12230 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
12240 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
12250 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
12260 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
12270 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
12280 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
12290 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
122a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
122b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
122c0 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
122d0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
122e0 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p;.  WhereInfo *
122f0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
12300 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
12310 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
12320 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
12330 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
12340 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
12350 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
12360 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
12370 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
12380 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
12390 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
123a0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
123b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  0 ){.    if( pTe
123c0 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29  mplate->nLTerm )
123d0 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
123e0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75  _ENABLED.      u
123f0 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
12400 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
12410 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
12420 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
12430 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  sert(pBuilder->p
12440 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65  OrSet, pTemplate
12450 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c  ->prereq, pTempl
12460 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20  ate->rRun,.     
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12490 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b  Template->nOut);
124a0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
124b0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
124c0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
124d0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
124e0 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
124f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12500 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20  f(x?"   or-%d:  
12510 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20  ":"   or-X:  ", 
12520 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  n);.        wher
12530 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
12540 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
12550 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  pWC);.      }.#e
12560 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
12570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12580 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
12590 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
125a0 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70  WhereLoop to rep
125b0 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c  lace with pTempl
125c0 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  ate.  */.  where
125d0 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70  LoopAdjustCost(p
125e0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
125f0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50  Template);.  ppP
12600 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  rev = whereLoopF
12610 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66  indLesser(&pWInf
12620 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
12630 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70  late);..  if( pp
12640 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Prev==0 ){.    /
12650 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20  * There already 
12660 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f  exists a WhereLo
12670 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74  op on the list t
12680 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20  hat is better.  
12690 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c    ** than pTempl
126a0 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e  ate, so just ign
126b0 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ore pTemplate */
126c0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
126d0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
126e0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
126f0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
12700 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
12710 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12720 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20    skip: ");.    
12730 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12740 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12750 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12760 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
12770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
12780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
12790 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a  = *ppPrev;.  }..
127a0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
127b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
127c0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
127d0 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f   p[] should be o
127e0 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  verwritten.  ** 
127f0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d  with pTemplate[]
12800 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20   if p[] exists, 
12810 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68  or if p==NULL th
12820 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  en allocate a ne
12830 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  w.  ** WhereLoop
12840 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a   and insert it..
12850 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52    */.#if WHERETR
12860 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
12870 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
12880 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
12890 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
128a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
128b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
128c0 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20  "replace: ");.  
128d0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
128e0 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
128f0 70 57 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pWC);.      sqli
12900 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12910 20 20 20 77 69 74 68 3a 20 22 29 3b 0a 20 20 20     with: ");.   
12920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
12930 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12940 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
12950 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 4c 6f     }.    whereLo
12960 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12970 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12980 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12990 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
129a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
129b0 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61  w WhereLoop to a
129c0 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  dd to the end of
129d0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20   the list */.   
129e0 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73   *ppPrev = p = s
129f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
12a00 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  wNN(db, sizeof(W
12a10 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
12a20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
12a30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12a40 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  KPT;.    whereLo
12a50 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70  opInit(p);.    p
12a60 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b  ->pNextLoop = 0;
12a70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
12a80 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   We will be over
12a90 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  writing WhereLoo
12aa0 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f  p p[].  But befo
12ab0 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a  re we do, first.
12ac0 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67      ** go throug
12ad0 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
12ae0 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74  e list and delet
12af0 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72  e any other entr
12b00 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20  ies besides.    
12b10 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20  ** p[] that are 
12b20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62  also supplated b
12b30 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
12b40 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70     WhereLoop **p
12b50 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78  pTail = &p->pNex
12b60 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65  tLoop;.    Where
12b70 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20  Loop *pToDel;.  
12b80 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c    while( *ppTail
12b90 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c   ){.      ppTail
12ba0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
12bb0 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70  Lesser(ppTail, p
12bc0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20  Template);.     
12bd0 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29   if( ppTail==0 )
12be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
12bf0 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a  oDel = *ppTail;.
12c00 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c        if( pToDel
12c10 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12c20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f     *ppTail = pTo
12c30 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  Del->pNextLoop;.
12c40 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12c50 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12c60 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12c70 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
12c80 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
12c90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12ca0 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20  (" delete: ");. 
12cb0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
12cc0 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42  Print(pToDel, pB
12cd0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
12ce0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12cf0 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
12d00 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a  te(db, pToDel);.
12d10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
12d20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
12d30 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
12d40 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
12d50 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
12d60 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
12d70 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
12d80 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
12d90 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
12da0 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
12db0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
12dc0 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
12dd0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
12de0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12df0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12e00 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
12e10 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
12e20 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
12e30 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12e40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
12e50 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
12e60 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
12e70 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
12e80 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a  an.** index..*.*
12e90 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52  * For every WHER
12ea0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12eb0 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12ec0 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12ed0 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20 74  nd which has a t
12ee0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12ef0 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65   assigned by one
12f00 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   of the likeliho
12f10 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28  od(),.** likely(
12f20 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29  ), or unlikely()
12f30 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20   SQL functions, 
12f40 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
12f50 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  ated number.** o
12f60 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
12f70 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
12f80 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
12f90 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65  * TUNING:  For e
12fa0 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12fb0 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12fc0 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12fd0 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12fe0 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  h does not have 
12ff0 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75 74  an assigned trut
13000 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68  h probability, h
13010 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73  euristics.** des
13020 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65  cribed below are
13030 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20   used to try to 
13040 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  estimate the tru
13050 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a  th probability..
13060 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68  ** TODO --> Perh
13070 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65  aps this is some
13080 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64  thing that could
13090 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20   be improved by 
130a0 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20  better.** table 
130b0 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a  statistics..**.*
130c0 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20 20  * Heuristic 1:  
130d0 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  Estimate the tru
130e0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
130f0 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39  s 93.75%.  The 9
13100 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63  3.75%.** value c
13110 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31  orresponds to -1
13120 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74   in LogEst notat
13130 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61  ion, so this mea
13140 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20  ns decrement.** 
13150 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
13160 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65  ut field for eve
13170 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63 6c  ry such WHERE cl
13180 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a  ause term..**.**
13190 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20 49   Heuristic 2:  I
131a0 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
131b0 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
131c0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
131d0 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d   the.** form "x=
131e0 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52 20  =EXPR" and EXPR 
131f0 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e  is not a constan
13200 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  t 0 or 1, then m
13210 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20  ake sure the.** 
13220 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77  final output row
13230 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20   estimate is no 
13240 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34  greater than 1/4
13250 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   of the total nu
13260 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
13270 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
13280 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
13290 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58  ssume that x==EX
132a0 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a  PR will filter.*
132b0 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33  * out at least 3
132c0 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20   out of 4 rows. 
132d0 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f   If EXPR is -1 o
132e0 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  r 0 or 1, then m
132f0 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20  aybe the.** "x" 
13300 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61  column is boolea
13310 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20  n or else -1 or 
13320 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d  0 or 1 is a comm
13330 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  on default value
13340 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63  .** on the "x" c
13350 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20  olumn and so in 
13360 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63  that case only c
13370 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ap the output ro
13380 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74  w estimate.** at
13390 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20   1/2 instead of 
133a0 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  1/4..*/.static v
133b0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
133c0 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65  putAdjust(.  Whe
133d0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
133e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
133f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
13400 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
13410 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
13420 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61  to adjust downwa
13430 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rd */.  LogEst n
13440 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f  Row            /
13450 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
13460 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74   in the entire t
13470 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
13480 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
13490 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
134a0 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
134b0 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
134c0 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
134d0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f  nt i, j, k;.  Lo
134e0 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30  gEst iReduce = 0
134f0 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e  ;    /* pLoop->n
13500 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65  Out should not e
13510 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75  xceed nRow-iRedu
13520 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
13530 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
13540 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
13550 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  DEX)==0 );.  for
13560 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70  (i=pWC->nTerm, p
13570 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30  Term=pWC->a; i>0
13580 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i--, pTerm++){
13590 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
135a0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
135b0 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72  VIRTUAL)!=0 ) br
135c0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54  eak;.    if( (pT
135d0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
135e0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
135f0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
13600 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
13610 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
13620 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f  Allowed)!=0 ) co
13630 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
13640 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d  j=pLoop->nLTerm-
13650 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
13660 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d       pX = pLoop-
13670 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
13680 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
13690 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
136a0 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72  ( pX==pTerm ) br
136b0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
136c0 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26  X->iParent>=0 &&
136d0 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50   (&pWC->a[pX->iP
136e0 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29  arent])==pTerm )
136f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13700 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
13710 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
13720 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
13730 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72        /* If a tr
13740 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
13750 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69  is specified usi
13760 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  ng the likelihoo
13770 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20  d() hints,.     
13780 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74     ** then use t
13790 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70  he probability p
137a0 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61  rovided by the a
137b0 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  pplication. */. 
137c0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
137d0 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
137e0 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
137f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
13800 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
13810 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74 68  f explicit truth
13820 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20   probabilities, 
13830 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20 74  use heuristics t
13840 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65  o.        ** gue
13850 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  ss a reasonable 
13860 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
13870 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  y. */.        pL
13880 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20  oop->nOut--;.   
13890 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
138a0 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
138b0 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
138c0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
138d0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
138e0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
138f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
13900 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
13910 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  TK_IS );.       
13920 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13930 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69 67  prIsInteger(pRig
13940 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d  ht, &k) && k>=(-
13950 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20  1) && k<=1 ){.  
13960 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30            k = 10
13970 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
13980 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  e{.            k
13990 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20   = 20;.         
139a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
139b0 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65   iReduce<k ) iRe
139c0 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20  duce = k;.      
139d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
139e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
139f0 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69  p->nOut > nRow-i
13a00 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d  Reduce )  pLoop-
13a10 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69  >nOut = nRow - i
13a20 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  Reduce;.}../* .*
13a30 2a 20 54 65 72 6d 20 70 54 65 72 6d 20 69 73 20  * Term pTerm is 
13a40 61 20 76 65 63 74 6f 72 20 72 61 6e 67 65 20 63  a vector range c
13a50 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
13a60 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20 63  ion. The first c
13a70 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20  omparison.** in 
13a80 74 68 65 20 76 65 63 74 6f 72 20 63 61 6e 20 62  the vector can b
13a90 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
13aa0 67 20 63 6f 6c 75 6d 6e 20 6e 45 71 20 6f 66 20  g column nEq of 
13ab0 74 68 65 20 69 6e 64 65 78 2e 20 54 68 69 73 0a  the index. This.
13ac0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
13ad0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
13ae0 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65  mber of vector e
13af0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 63 61 6e  lements that can
13b00 20 62 65 20 75 73 65 64 0a 2a 2a 20 61 73 20 70   be used.** as p
13b10 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
13b20 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
13b30 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
13b40 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
13b50 0a 2a 2a 0a 2a 2a 20 20 20 57 48 45 52 45 20 61  .**.**   WHERE a
13b60 20 3d 20 3f 20 41 4e 44 20 28 62 2c 20 63 2c 20   = ? AND (b, c, 
13b70 64 29 20 3e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a  d) > (?, ?, ?).*
13b80 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64  *.** and the ind
13b90 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ex:.**.**   CREA
13ba0 54 45 20 49 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20  TE INDEX ... ON 
13bb0 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  (a, b, c, d, e).
13bc0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  **.** then this 
13bd0 66 75 6e 63 74 69 6f 6e 20 77 6f 75 6c 64 20 62  function would b
13be0 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e  e invoked with n
13bf0 45 71 3d 31 2e 20 54 68 65 20 76 61 6c 75 65 20  Eq=1. The value 
13c00 72 65 74 75 72 6e 65 64 20 69 6e 0a 2a 2a 20 74  returned in.** t
13c10 68 69 73 20 63 61 73 65 20 69 73 20 33 2e 0a 2a  his case is 3..*
13c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13c30 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e  reRangeVectorLen
13c40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13c50 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
13c60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13c70 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
13c80 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
13c90 6f 70 65 6e 20 6f 6e 20 70 49 64 78 20 2a 2f 0a  open on pIdx */.
13ca0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
13cb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
13cc0 64 65 78 20 74 6f 20 62 65 20 75 73 65 64 20 66  dex to be used f
13cd0 6f 72 20 61 20 69 6e 65 71 75 61 6c 69 74 79 20  or a inequality 
13ce0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
13cf0 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20  int nEq,        
13d00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13d10 66 20 70 72 69 6f 72 20 65 71 75 61 6c 69 74 79  f prior equality
13d20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
13d30 73 61 6d 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  same index */.  
13d40 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
13d50 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
13d60 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  or inequality co
13d70 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
13d80 20 69 6e 74 20 6e 43 6d 70 20 3d 20 73 71 6c 69   int nCmp = sqli
13d90 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
13da0 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
13db0 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b  pLeft);.  int i;
13dc0 0a 0a 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  ..  nCmp = MIN(n
13dd0 43 6d 70 2c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  Cmp, (pIdx->nCol
13de0 75 6d 6e 20 2d 20 6e 45 71 29 29 3b 0a 20 20 66  umn - nEq));.  f
13df0 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20  or(i=1; i<nCmp; 
13e00 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 65 73  i++){.    /* Tes
13e10 74 20 69 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t if comparison 
13e20 69 20 6f 66 20 70 54 65 72 6d 20 69 73 20 63 6f  i of pTerm is co
13e30 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 63 6f  mpatible with co
13e40 6c 75 6d 6e 20 28 69 2b 6e 45 71 29 20 0a 20 20  lumn (i+nEq) .  
13e50 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
13e60 78 2e 20 49 66 20 6e 6f 74 2c 20 65 78 69 74 20  x. If not, exit 
13e70 74 68 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  the loop.  */.  
13e80 20 20 63 68 61 72 20 61 66 66 3b 20 20 20 20 20    char aff;     
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
13eb0 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 63 68  finity */.    ch
13ec0 61 72 20 69 64 78 61 66 66 20 3d 20 30 3b 20 20  ar idxaff = 0;  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13ee0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
13ef0 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43  ffinity */.    C
13f00 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f20 43 6f 6d 70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61  Comparison colla
13f30 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
13f40 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20  .    Expr *pLhs 
13f50 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
13f60 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pLeft->x.pList->
13f70 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13f80 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 54 65  Expr *pRhs = pTe
13f90 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13fa0 74 3b 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  t;.    if( pRhs-
13fb0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
13fc0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70  elect ){.      p
13fd0 52 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70 53  Rhs = pRhs->x.pS
13fe0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
13ff0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
14000 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 68 73  else{.      pRhs
14010 20 3d 20 70 52 68 73 2d 3e 78 2e 70 4c 69 73 74   = pRhs->x.pList
14020 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
14030 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
14040 6b 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 6f  k that the LHS o
14050 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
14060 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66   is a column ref
14070 65 72 65 6e 63 65 20 74 6f 0a 20 20 20 20 2a 2a  erence to.    **
14080 20 74 68 65 20 72 69 67 68 74 20 63 6f 6c 75 6d   the right colum
14090 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 73  n of the right s
140a0 6f 75 72 63 65 20 74 61 62 6c 65 2e 20 41 6e 64  ource table. And
140b0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 0a 20   that the sort. 
140c0 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74     ** order of t
140d0 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
140e0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
140f0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66  he sort order of
14100 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
14110 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d  most index colum
14120 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  n.  */.    if( p
14130 4c 68 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Lhs->op!=TK_COLU
14140 4d 4e 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73  MN .     || pLhs
14150 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 0a  ->iTable!=iCur .
14160 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 43       || pLhs->iC
14170 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43  olumn!=pIdx->aiC
14180 6f 6c 75 6d 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20  olumn[i+nEq] .  
14190 20 20 20 7c 7c 20 70 49 64 78 2d 3e 61 53 6f 72     || pIdx->aSor
141a0 74 4f 72 64 65 72 5b 69 2b 6e 45 71 5d 21 3d 70  tOrder[i+nEq]!=p
141b0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
141c0 6e 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq].    ){.    
141d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
141e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
141f0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
14200 52 4f 57 49 44 20 29 3b 0a 20 20 20 20 61 66 66  ROWID );.    aff
14210 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
14220 65 41 66 66 69 6e 69 74 79 28 70 52 68 73 2c 20  eAffinity(pRhs, 
14230 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
14240 69 74 79 28 70 4c 68 73 29 29 3b 0a 20 20 20 20  ity(pLhs));.    
14250 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33  idxaff = sqlite3
14260 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e  TableColumnAffin
14270 69 74 79 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  ity(pIdx->pTable
14280 2c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29  , pLhs->iColumn)
14290 3b 0a 20 20 20 20 69 66 28 20 61 66 66 21 3d 69  ;.    if( aff!=i
142a0 64 78 61 66 66 20 29 20 62 72 65 61 6b 3b 0a 0a  dxaff ) break;..
142b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
142c0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
142d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
142e0 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
142f0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
14300 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73  break;.    if( s
14310 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
14320 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  oll->zName, pIdx
14330 2d 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29  ->azColl[i+nEq])
14340 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
14350 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
14360 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f  ** Adjust the co
14370 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74  st C by the cost
14380 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20  Mult facter T.  
14390 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73  This only occurs
143a0 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20   if.** compiled 
143b0 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e  with -DSQLITE_EN
143c0 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f  ABLE_COSTMULT.*/
143d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
143e0 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23  NABLE_COSTMULT.#
143f0 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
14400 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
14410 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23    C += T.#else.#
14420 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
14430 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
14440 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
14450 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61  e have so far ma
14460 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e  tched pBuilder->
14470 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14480 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a  q terms of the .
14490 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e  ** index pIndex.
144a0 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e   Try to match on
144b0 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  e more..**.** Wh
144c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
144d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69   is called, pBui
144e0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74  lder->pNew->nOut
144f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a   contains the .*
14500 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
14510 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20   expected to be 
14520 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65  visited by filte
14530 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e  ring using the n
14540 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  Eq .** terms onl
14550 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69  y. If it is modi
14560 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65  fied, this value
14570 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66   is restored bef
14580 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
14590 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
145a0 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
145b0 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
145c0 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
145d0 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
145e0 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
145f0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
14600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
14610 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
14620 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
14630 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
14640 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
14650 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
14660 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
14670 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
14680 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
14690 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
146a0 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
146b0 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146d0 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
146e0 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49  c */.  LogEst nI
146f0 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20  nMul            
14700 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75         /* log(Nu
14710 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
14720 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f  ns due to IN) */
14730 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
14740 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
14750 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20  er->pWInfo;  /* 
14760 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f  WHERE analyse co
14770 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
14780 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
14790 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
147a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
147b0 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
147c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
147d0 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
147e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
147f0 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20   malloc context 
14800 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
14810 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
14820 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
14830 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72   WhereLoop under
14840 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14850 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14860 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
14870 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72     /* A WhereTer
14880 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72  m under consider
14890 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ation */.  int o
148a0 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
148b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
148c0 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  lid operators fo
148d0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
148e0 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
148f0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
14900 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
14910 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a  or WHERE terms *
14920 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65  /.  Bitmask save
14930 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  d_prereq;       
14940 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14950 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70  value of pNew->p
14960 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73  rereq */.  u16 s
14970 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20  aved_nLTerm;    
14980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14990 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
149a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a  pNew->nLTerm */.
149b0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b    u16 saved_nEq;
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
149e0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
149f0 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31  tree.nEq */.  u1
14a00 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20  6 saved_nBtm;   
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a20 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14a30 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
14a40 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73  .nBtm */.  u16 s
14a50 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20  aved_nTop;      
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 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
14a90 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  op */.  u16 save
14aa0 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
14ab0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14ac0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14ad0 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  w->nSkip */.  u3
14ae0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
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 77 73 46 6c 61 67 73  of pNew->wsFlags
14b20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
14b30 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
14b40 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
14b50 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
14b60 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72  >nOut */.  int r
14b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14b90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
14ba0 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14bc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
14bd0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
14be0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
14bf0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
14c00 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
14c10 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
14c20 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14c30 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
14c40 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
14c50 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
14c60 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
14c70 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
14c80 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
14c90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
14ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14cb0 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52 45 54 52  _BKPT;.  WHERETR
14cc0 41 43 45 28 30 78 38 30 30 2c 20 28 22 42 45 47  ACE(0x800, ("BEG
14cd0 49 4e 20 61 64 64 42 74 72 65 65 49 64 78 28 25  IN addBtreeIdx(%
14ce0 73 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  s), nEq=%d\n",. 
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d      pProbe->zNam
14d10 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  e, pNew->u.btree
14d20 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72  .nEq));..  asser
14d30 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
14d40 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
14d50 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
14d60 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
14d70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
14d80 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
14d90 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
14da0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
14db0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
14dc0 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
14dd0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
14de0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
14df0 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b  btree.nBtm==0 );
14e00 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
14e10 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c  _EQ|WO_IN|WO_GT|
14e20 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
14e30 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  E|WO_ISNULL|WO_I
14e40 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  S;.  }.  if( pPr
14e50 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
14e60 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
14e70 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
14e80 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72  WO_LE);..  asser
14e90 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
14ea0 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
14eb0 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64  lumn );..  saved
14ec0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
14ed0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
14ee0 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75  d_nBtm = pNew->u
14ef0 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73  .btree.nBtm;.  s
14f00 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77  aved_nTop = pNew
14f10 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
14f20 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
14f30 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73  pNew->nSkip;.  s
14f40 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
14f50 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
14f60 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
14f70 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
14f80 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
14f90 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
14fa0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
14fb0 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d  >nOut;.  pTerm =
14fc0 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
14fd0 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e  scan, pBuilder->
14fe0 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  pWC, pSrc->iCurs
14ff0 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20  or, saved_nEq,. 
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
15020 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e  Probe);.  pNew->
15030 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53  rSetup = 0;.  rS
15040 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
15050 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
15060 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
15070 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28  g(rSize);.  for(
15080 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15090 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
150a0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
150b0 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
150c0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
150d0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
150e0 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
150f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15100 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
15110 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
15120 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
15130 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
15140 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
15150 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
15160 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
15170 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
15180 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
15190 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
151a0 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
151b0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
151c0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
151d0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
151e0 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
151f0 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
15200 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69  L)!=0).     && i
15210 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c  ndexColumnNotNul
15220 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  l(pProbe, saved_
15230 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
15240 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69    continue; /* i
15250 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e  gnore IS [NOT] N
15260 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
15270 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
15280 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  mns */.    }.   
15290 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
152a0 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
152b0 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
152c0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  nue;..    /* Do 
152d0 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70  not allow the up
152e0 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c  per bound of a L
152f0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
15300 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
15310 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20  t.    ** to mix 
15320 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e  with a lower ran
15330 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f  ge bound from so
15340 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20  me other source 
15350 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
15360 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
15370 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72  _LIKEOPT && pTer
15380 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
15390 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _LT ) continue;.
153a0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
153b0 6c 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69  llow IS constrai
153c0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nts from the WHE
153d0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
153e0 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  used by the.    
153f0 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  ** right table o
15400 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
15410 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  Only constraints
15420 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
15430 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c  e are.    ** all
15440 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  owed */.    if( 
15450 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
15460 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
15470 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
15480 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
15490 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
154a0 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f  oin).     && (eO
154b0 70 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53  p & (WO_IS|WO_IS
154c0 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b  NULL))!=0.    ){
154d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
154e0 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
154f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15500 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
15510 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
15520 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
15530 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
15540 70 50 72 6f 62 65 29 20 26 26 20 73 61 76 65 64  pProbe) && saved
15550 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b  _nEq==pProbe->nK
15560 65 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  eyCol-1 ){.     
15570 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
15580 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c  ags |= SQLITE_BL
15590 44 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  DF_UNIQUE;.    }
155a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75 69  else{.      pBui
155b0 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c  lder->bldFlags |
155c0 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e  = SQLITE_BLDF_IN
155d0 44 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  DEXED;.    }.   
155e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
155f0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
15600 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15610 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
15620 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  q;.    pNew->u.b
15630 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
15640 64 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77  d_nBtm;.    pNew
15650 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
15660 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20   saved_nTop;.   
15670 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
15680 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
15690 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
156a0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
156b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
156c0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
156d0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
156e0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
156f0 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
15700 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
15710 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
15720 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15730 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
15740 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65  kSelf;..    asse
15750 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20  rt( nInMul==0.  
15760 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
15770 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15780 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20  COLUMN_NULL)!=0 
15790 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
157a0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
157b0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30  RE_COLUMN_IN)!=0
157c0 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
157d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
157e0 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30  ERE_SKIPSCAN)!=0
157f0 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66   .    );..    if
15800 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b  ( eOp & WO_IN ){
15810 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
15820 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
15830 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
15840 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15850 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
15860 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
15870 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
15880 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
15890 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
158a0 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
158b0 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
158c0 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
158d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
158e0 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  i;.        nIn =
158f0 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
15900 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
15910 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  25) );..        
15920 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
15930 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  n may actually b
15940 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78  e of the form (x
15950 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e  , y) IN (SELECT.
15960 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ..)..        ** 
15970 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
15980 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65  re is a separate
15990 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f   term for each o
159a0 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20  f (x) and (y).. 
159b0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
159c0 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69  r, the nIn multi
159d0 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c  plier should onl
159e0 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63  y be applied onc
159f0 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20  e, not once.    
15a00 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20      ** for each 
15a10 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66  such term. The f
15a20 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68  ollowing loop ch
15a30 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20  ecks that pTerm 
15a40 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  is the.        *
15a50 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72  * first such ter
15a60 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65  m in use, and se
15a70 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30  ts nIn back to 0
15a80 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a   if it is not. *
15a90 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
15aa0 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72  0; i<pNew->nLTer
15ab0 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m-1; i++){.     
15ac0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61       if( pNew->a
15ad0 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77  LTerm[i] && pNew
15ae0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
15af0 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20  pr==pExpr ) nIn 
15b00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
15b10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
15b20 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
15b30 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
15b40 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
15b50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
15b60 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
15b70 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
15b80 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
15b90 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
15ba0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
15bb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
15bc0 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
15bd0 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
15be0 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
15bf0 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22      ** changes "
15c20 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22  x IN (?)" into "
15c30 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  x=?". */.      }
15c40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15c50 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
15c60 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  S) ){.      int 
15c70 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
15c80 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45  iColumn[saved_nE
15c90 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  q];.      pNew->
15ca0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
15cb0 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
15cc0 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f    assert( saved_
15cd0 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72  nEq==pNew->u.btr
15ce0 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20  ee.nEq );.      
15cf0 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  if( iCol==XN_ROW
15d00 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69  ID .       || (i
15d10 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d  Col>0 && nInMul=
15d20 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  =0 && saved_nEq=
15d30 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
15d40 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
15d50 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
15d60 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71   && pProbe->uniq
15d70 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  NotNull==0 ){.  
15d80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
15d90 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
15da0 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20  NQ_WANTED;.     
15db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15dc0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15dd0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
15de0 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  W;.        }.   
15df0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15e00 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
15e10 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  LL ){.      pNew
15e20 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15e30 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
15e40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
15e50 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  p & (WO_GT|WO_GE
15e60 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
15e70 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54  ase( eOp & WO_GT
15e80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15e90 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20  se( eOp & WO_GE 
15ea0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
15eb0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15ec0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
15ed0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
15ee0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15ef0 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61  e.nBtm = whereRa
15f00 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
15f10 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
15f20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
15f30 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
15f40 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b  , pTerm.      );
15f50 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
15f60 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
15f70 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
15f80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15f90 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
15fa0 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
15fb0 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
15fc0 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
15fd0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
15fe0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
15ff0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
16000 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
16010 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
16020 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
16030 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
16040 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
16050 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
16060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16070 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
16080 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
16090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
160a0 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
160b0 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
160c0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
160d0 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
160e0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
160f0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
16100 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
16110 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
16120 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
16130 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
16140 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
16150 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
16160 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16170 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Top = 1;.      }
16180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16190 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
161a0 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
161b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
161c0 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
161d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
161e0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
161f0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16200 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
16210 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
16220 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
16230 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
16240 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  op = whereRangeV
16250 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
16260 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
16270 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
16280 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
16290 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
162a0 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
162b0 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
162c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
162d0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
162e0 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
162f0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16300 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
16310 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
16320 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
16330 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
16340 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
16350 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16360 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
16370 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
16380 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
16390 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
163a0 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
163b0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
163c0 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
163d0 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
163e0 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
163f0 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
16400 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
16410 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
16420 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
16430 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
16440 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
16450 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
16460 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
16470 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
16480 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
16490 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
164a0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
164b0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
164c0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
164d0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
164e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
164f0 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
16500 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
16510 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
16520 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
16530 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
16540 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
16550 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
16560 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
16570 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16580 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
16590 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
165a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
165b0 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
165c0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
165d0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
165e0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
165f0 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a  O_IN|WO_IS) );..
16600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
16610 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
16620 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  nOut );.      if
16630 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
16640 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ob<=0 && pProbe-
16650 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
16660 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  nEq]>=0 ){.     
16670 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
16680 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
16690 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
166a0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
166b0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
166c0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
166d0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
166e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
166f0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
16700 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
16710 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16720 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
16730 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
16740 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16750 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
16760 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
16770 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
16780 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
16790 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
167a0 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
167b0 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
167c0 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
167d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
167e0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
167f0 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
16800 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
16810 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
16820 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
16830 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
16840 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
16850 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
16860 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
16870 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
16880 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16890 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
168a0 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
168b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
168c0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
168d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
168e0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
168f0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16900 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
16910 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
16920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16930 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16940 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
16950 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
16960 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
16970 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
16980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
16990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
169a0 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
169b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
169c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
169d0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
169e0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
169f0 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
16a00 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
16a10 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
16a20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16a30 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
16a40 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
16a50 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
16a60 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
16a70 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
16a80 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
16a90 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
16aa0 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
16ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ac0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
16ad0 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
16ae0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
16af0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
16b00 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
16b10 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
16b20 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
16b30 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
16b40 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
16b50 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
16b60 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
16b70 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
16b80 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
16b90 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
16ba0 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
16bb0 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
16bc0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
16bd0 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
16be0 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
16bf0 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
16c00 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
16c10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
16c20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
16c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16c40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16c50 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
16c60 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
16c70 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
16c80 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
16c90 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
16ca0 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
16cb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
16cc0 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
16cd0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
16ce0 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
16cf0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
16d00 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
16d10 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
16d20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
16d30 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
16d40 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
16d50 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
16d60 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
16d70 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
16d80 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
16d90 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
16da0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
16db0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
16dc0 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
16dd0 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
16de0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
16df0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
16e00 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
16e10 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
16e20 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
16e30 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
16e40 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
16e50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
16e60 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
16e70 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
16e80 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
16e90 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
16ea0 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
16eb0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
16ec0 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
16ed0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
16ee0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
16ef0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
16f00 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
16f10 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
16f20 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
16f30 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
16f40 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
16f50 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
16f60 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
16f70 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
16f80 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
16f90 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
16fa0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
16fb0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
16fc0 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
16fd0 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
16fe0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
16ff0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
17000 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
17010 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
17020 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
17030 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
17040 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
17050 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
17060 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
17070 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
17080 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
17090 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
170a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
170b0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
170c0 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
170d0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
170e0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
170f0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
17100 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
17110 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
17120 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17130 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
17140 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
17150 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e  d_nBtm;.  pNew->
17160 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73  u.btree.nTop = s
17170 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65  aved_nTop;.  pNe
17180 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
17190 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
171a0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
171b0 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
171c0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
171d0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
171e0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
171f0 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
17200 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
17210 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
17220 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
17230 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
17240 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
17250 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
17260 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
17270 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
17280 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
17290 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
172a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
172b0 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
172c0 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
172d0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
172e0 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
172f0 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
17300 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
17310 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
17320 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
17330 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
17340 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
17350 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
17360 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
17370 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
17380 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
17390 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
173a0 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
173b0 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
173c0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
173d0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
173e0 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
173f0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
17400 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
17410 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
17420 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
17430 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
17440 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
17450 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
17460 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
17470 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
17480 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
17490 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
174a0 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
174b0 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
174c0 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
174d0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
174e0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
174f0 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
17500 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
17510 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
17520 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
17530 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
17540 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
17550 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
17560 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
17570 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
17580 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
17590 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
175a0 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
175b0 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
175c0 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
175d0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
175e0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
175f0 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
17600 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
17610 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
17620 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17630 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
17640 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
17650 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
17660 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
17670 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
17680 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
17690 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
176a0 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
176b0 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
176c0 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
176d0 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
176e0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
176f0 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
17700 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
17710 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
17720 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
17730 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
17740 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
17750 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
17760 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
17770 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17780 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
17790 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
177a0 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
177b0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
177c0 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48  Flags;.  }..  WH
177d0 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
177e0 28 22 45 4e 44 20 61 64 64 42 74 72 65 65 49 64  ("END addBtreeId
177f0 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72  x(%s), nEq=%d, r
17800 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17820 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61  Probe->zName, sa
17830 76 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a 20  ved_nEq, rc));. 
17840 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17850 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
17860 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17870 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
17880 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
17890 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
178a0 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
178b0 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
178c0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
178d0 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
178e0 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
178f0 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
17900 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
17910 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
17920 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
17930 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
17940 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
17950 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
17960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
17970 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
17980 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
17990 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
179a0 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
179b0 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
179c0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
179d0 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
179e0 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
179f0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
17a00 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
17a10 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
17a20 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
17a30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
17a40 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
17a50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
17a60 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
17a70 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
17a80 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17a90 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
17aa0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
17ab0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
17ac0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
17ad0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
17ae0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
17af0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
17b00 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
17b10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17b20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
17b30 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
17b40 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
17b50 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
17b60 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
17b70 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
17b80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17b90 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
17ba0 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
17bb0 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
17bc0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
17bd0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
17be0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
17bf0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
17c00 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
17c10 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
17c20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17c30 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
17c40 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e  pExpr,aColExpr->
17c50 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  a[jj].pExpr,iCur
17c60 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sor)==0 ){.     
17c70 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
17c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17ca0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17cb0 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
17cc0 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
17cd0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
17ce0 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
17cf0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
17d00 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
17d10 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
17d20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
17d30 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
17d40 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
17d50 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
17d60 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
17d70 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
17d80 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
17d90 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
17da0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
17db0 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
17dc0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
17dd0 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
17de0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
17df0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
17e00 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
17e10 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
17e20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
17e30 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
17e40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
17e50 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
17e60 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
17e70 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
17e80 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
17e90 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
17ea0 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
17eb0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
17ec0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
17ed0 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
17ee0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
17ef0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
17f00 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
17f10 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
17f20 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
17f30 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
17f40 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72  rm *pTerm;.  Par
17f50 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
17f60 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
17f70 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
17f80 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
17f90 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
17fa0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
17fb0 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
17fc0 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
17fd0 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
17fe0 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
17ff0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  t;.  }.  if( pPa
18000 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
18010 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
18020 53 47 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b  SG ) pParse = 0;
18030 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
18040 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
18050 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
18060 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
18070 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
18080 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
18090 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
180a0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
180b0 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
180c0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
180d0 69 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71  iTab).     && sq
180e0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
180f0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18100 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
18110 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
18120 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
18130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18140 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
18150 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
18160 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
18170 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
18180 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
18190 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69  e.** is identifi
181a0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
181b0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
181c0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
181d0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
181e0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
181f0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
18200 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
18210 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
18220 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
18230 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
18240 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
18250 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
18260 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
18270 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
18280 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
18290 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
182a0 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
182b0 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
182c0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
182d0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
182e0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
182f0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
18300 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18320 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
18330 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18340 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
18350 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
18360 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
18370 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
18380 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
18390 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
183a0 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
183b0 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
183c0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
183d0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
183e0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
183f0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
18400 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
18410 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
18420 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
18430 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18440 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
18450 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
18460 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
18470 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18480 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
18490 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
184a0 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
184b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
184c0 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
184d0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
184e0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
184f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18500 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
18510 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
18520 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
18530 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
18540 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
18550 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
18560 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
18570 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
18580 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
18590 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
185a0 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
185b0 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
185c0 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
185d0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
185e0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
185f0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
18600 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
18610 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
18620 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
18630 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
18640 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
18650 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
18660 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
18670 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
18680 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
18690 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
186a0 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
186b0 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
186c0 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
186d0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
186e0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
186f0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
18700 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
18710 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
18720 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
18730 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
18740 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
18750 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
18760 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
18770 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
18780 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
18790 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
187a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
187b0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
187c0 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
187d0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
187e0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
187f0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
18800 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
18810 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
18820 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
18830 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
18840 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
18850 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
18860 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
18870 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20  rereq           
18880 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
18890 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
188a0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
188b0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
188c0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
188d0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
188e0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
188f0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18910 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
18920 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
18930 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
18940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18950 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
18960 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
18970 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
18980 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
18990 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
189a0 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
189b0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
189c0 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
189d0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
189e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
189f0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
18a00 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
18a10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
18a20 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
18a30 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18a40 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
18a50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
18a60 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
18a70 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
18a80 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
18a90 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
18aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
18ab0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
18ac0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
18ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
18ae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18af0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
18b00 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
18b10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18b20 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
18b30 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
18b40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
18b50 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
18b60 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b80 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
18b90 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
18ba0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
18bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18bc0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
18bd0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18be0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
18bf0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18c00 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
18c10 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
18c20 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
18c30 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
18c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
18c50 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
18c60 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
18c70 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
18c80 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
18c90 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
18ca0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
18cb0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
18cc0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
18cd0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
18ce0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
18cf0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
18d00 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
18d10 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
18d20 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
18d30 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
18d40 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
18d50 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
18d60 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
18d70 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
18d80 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
18d90 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
18da0 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
18db0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
18dc0 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
18dd0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
18de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18df0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
18e00 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
18e10 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
18e20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
18e30 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
18e40 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
18e50 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
18e60 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
18e70 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
18e80 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
18e90 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
18ea0 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
18eb0 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
18ec0 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
18ed0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
18ee0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
18ef0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
18f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18f10 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
18f20 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
18f30 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
18f40 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
18f50 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
18f60 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
18f70 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
18f80 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
18f90 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
18fa0 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
18fb0 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
18fc0 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
18fd0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
18fe0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
18ff0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
19000 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
19010 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
19020 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
19030 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
19040 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
19050 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
19060 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
19070 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
19080 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
19090 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
190a0 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
190b0 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
190c0 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
190d0 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
190e0 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
190f0 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
19100 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
19110 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
19120 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
19130 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
19140 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
19150 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
19160 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
19170 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
19180 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
19190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
191a0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
191b0 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
191c0 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
191d0 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
191e0 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
191f0 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
19200 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
19210 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
19220 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
19230 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
19240 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
19250 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
19260 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
19270 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
19280 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
19290 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
192a0 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
192b0 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
192c0 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
192d0 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
192e0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
192f0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
19300 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
19310 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
19320 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
19330 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
19340 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
19350 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
19360 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
19370 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
19380 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
19390 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
193a0 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
193b0 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
193c0 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
193d0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
193e0 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
193f0 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
19400 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
19410 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19420 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
19430 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
19440 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
19450 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
19460 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
19470 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
19480 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
19490 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
194a0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
194b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
194c0 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
194d0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
194e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
194f0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
19500 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19510 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
19520 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
19530 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
19540 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
19550 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
19560 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
19570 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
19580 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
19590 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
195a0 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
195b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
195c0 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
195d0 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
195e0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
195f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19600 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
19610 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
19620 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
19630 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
19640 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
19650 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
19660 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c  bles or 1.375 (L
19670 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65  ogEst=4) for vie
19680 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
19690 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
196a0 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
196b0 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
196c0 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
196d0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
196e0 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
196f0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
19700 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
19710 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
19720 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
19730 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
19740 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
19750 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
19760 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
19770 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
19780 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
19790 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
197a0 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
197b0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
197c0 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
197d0 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  ze + 4;.        
197e0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
197f0 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
19800 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
19810 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
19820 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
19830 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20  etup += 24;.    
19840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
19850 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
19860 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
19870 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
19880 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
19890 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20 70 4e  w->rSetup<0 ) pN
198a0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
198b0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
198c0 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
198d0 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
198e0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
198f0 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
19900 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
19910 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
19920 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
19930 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
19940 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
19950 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
19960 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
19970 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
19980 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
19990 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
199a0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
199b0 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
199c0 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
199d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
199e0 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
199f0 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
19a00 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
19a10 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
19a20 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
19a30 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
19a40 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
19a50 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
19a60 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
19a70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
19a80 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c  ereq = mPrereq |
19a90 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19aa0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
19ab0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
19ac0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
19ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19ae0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
19af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
19b00 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
19b10 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
19b20 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
19b30 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
19b40 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
19b50 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
19b60 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
19b70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
19b80 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
19b90 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
19ba0 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
19bb0 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
19bc0 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
19bd0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
19be0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
19bf0 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
19c00 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
19c10 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
19c20 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
19c30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
19c40 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
19c50 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
19c60 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
19c70 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
19c80 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
19c90 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
19ca0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
19cb0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19cc0 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30  u.btree.nBtm = 0
19cd0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
19ce0 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20  ree.nTop = 0;.  
19cf0 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
19d00 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
19d10 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
19d20 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
19d30 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
19d40 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
19d50 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
19d60 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  q;.    pNew->nOu
19d70 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70  t = rSize;.    p
19d80 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
19d90 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
19da0 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
19db0 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
19dc0 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
19dd0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
19de0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
19df0 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
19e00 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
19e10 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
19e20 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
19e30 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
19e40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
19e50 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
19e60 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
19e70 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
19e80 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
19e90 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
19ea0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
19eb0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
19ec0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
19ed0 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
19ee0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
19ef0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
19f00 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
19f10 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
19f20 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
19f30 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
19f40 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
19f50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
19f60 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
19f70 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
19f80 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
19f90 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
19fa0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
19fb0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
19fc0 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
19fd0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
19fe0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
19ff0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1a000 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
1a010 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
1a020 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1a030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a040 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
1a050 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1a060 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
1a070 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1a080 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
1a090 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
1a0a0 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
1a0b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1a0c0 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
1a0d0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
1a0e0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
1a0f0 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70  robe);.        p
1a100 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  New->wsFlags = (
1a110 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49  m==0) ? (WHERE_I
1a120 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e  DX_ONLY|WHERE_IN
1a130 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49  DEXED) : WHERE_I
1a140 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a  NDEXED;.      }.
1a150 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73  .      /* Full s
1a160 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f  can via index */
1a170 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20  .      if( b.   
1a180 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
1a190 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c  (pTab).       ||
1a1a0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
1a1b0 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20  xWhere!=0.      
1a1c0 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
1a1d0 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
1a1e0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
1a1f0 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65        && (pProbe
1a200 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
1a210 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20  >szTabRow).     
1a220 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
1a230 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1a240 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
1a250 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
1a260 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
1a270 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
1a280 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
1a290 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
1a2a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1a2b0 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
1a2c0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
1a2d0 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
1a2e0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1a2f0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
1a300 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20  dx : 0;..       
1a310 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
1a320 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64  visiting the ind
1a330 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20  ex rows is N*K, 
1a340 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20  where K is.     
1a350 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e     ** between 1.
1a360 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e  1 and 3.0, depen
1a370 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61  ding on the rela
1a380 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
1a390 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
1a3a0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77  ex and table row
1a3b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
1a3c0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
1a3d0 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
1a3e0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
1a3f0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
1a400 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b       if( m!=0 ){
1a410 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1a420 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
1a430 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
1a440 61 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63  an, add in the c
1a450 6f 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ost of.         
1a460 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20   ** doing table 
1a470 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f  lookups.  The co
1a480 73 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68  st will be 3x th
1a490 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
1a4a0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73        ** lookups
1a4b0 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63  .  Take into acc
1a4c0 6f 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  ount WHERE claus
1a4d0 65 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e  e terms that can
1a4e0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
1a4f0 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
1a500 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c   just the index,
1a510 20 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74   and that do not
1a520 20 72 65 71 75 69 72 65 20 61 0a 20 20 20 20 20   require a.     
1a530 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f       ** table lo
1a540 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20  okup. */.       
1a550 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75     LogEst nLooku
1a560 70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20  p = rSize + 16; 
1a570 20 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20   /* Base cost:  
1a580 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  N*3 */.         
1a590 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1a5a0 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53     int iCur = pS
1a5b0 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  rc->iCursor;.   
1a5c0 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
1a5d0 73 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e  se *pWC2 = &pWIn
1a5e0 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20  fo->sWC;.       
1a5f0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1a600 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  pWC2->nTerm; ii+
1a610 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1a620 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1a630 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b   = &pWC2->a[ii];
1a640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a650 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76   !sqlite3ExprCov
1a660 65 72 65 64 42 79 49 6e 64 65 78 28 70 54 65 72  eredByIndex(pTer
1a670 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20  m->pExpr, iCur, 
1a680 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
1a690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65            /* pTe
1a6c0 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  rm can be evalua
1a6d0 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ted using just t
1a6e0 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65  he index.  So re
1a6f0 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  duce.           
1a700 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65 64   ** the expected
1a710 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
1a720 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69   lookups accordi
1a730 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  ngly */.        
1a740 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
1a750 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
1a770 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  okup += pTerm->t
1a780 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
1a790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a7a0 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b             nLook
1a7b0 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  up--;.          
1a7c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1a7d0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
1a7e0 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b  Q|WO_IS) ) nLook
1a7f0 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20  up -= 19;.      
1a800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a810 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20    }.          . 
1a820 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
1a830 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
1a840 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
1a850 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20  n, nLookup);.   
1a860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
1a870 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
1a880 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
1a890 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
1a8a0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
1a8b0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
1a8c0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
1a8d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1a8e0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1a8f0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1a900 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1a910 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
1a920 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
1a930 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1a940 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
1a950 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  bldFlags = 0;.  
1a960 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1a970 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
1a980 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
1a990 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  robe, 0);.    if
1a9a0 28 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46  ( pBuilder->bldF
1a9b0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44  lags==SQLITE_BLD
1a9c0 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  F_INDEXED ){.   
1a9d0 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75     /* If a non-u
1a9e0 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75  nique index is u
1a9f0 73 65 64 2c 20 6f 72 20 69 66 20 61 20 70 72 65  sed, or if a pre
1aa00 66 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 66  fix of the key f
1aa10 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71  or.      ** uniq
1aa20 75 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  ue index is used
1aa30 20 28 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e 64   (making the ind
1aa40 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20  ex functionally 
1aa50 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20 20  non-unique).    
1aa60 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 71    ** then the sq
1aa70 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 20  lite_stat1 data 
1aa80 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e  becomes importan
1aa90 74 20 66 6f 72 20 73 63 6f 72 69 6e 67 20 74 68  t for scoring th
1aaa0 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20  e.      ** plan 
1aab0 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  */.      pTab->t
1aac0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74  abFlags |= TF_St
1aad0 61 74 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23  atsUsed;.    }.#
1aae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1aaf0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
1ab00 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
1ab10 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
1ab20 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
1ab30 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
1ab40 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
1ab50 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
1ab60 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
1ab70 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1ab80 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1ab90 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
1aba0 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
1abb0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
1abc0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
1abd0 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20  Src->pIBIndex ) 
1abe0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1abf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1ac00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1ac10 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a  IRTUALTABLE../*.
1ac20 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  ** Argument pIdx
1ac30 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20  Info is already 
1ac40 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
1ac50 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ll constraints t
1ac60 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
1ac70 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61  ed by the virtua
1ac80 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  l table identifi
1ac90 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
1aca0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73  pNew->iTab. This
1acb0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72  .** function mar
1acc0 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ks a subset of t
1acd0 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hose constraints
1ace0 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73   usable, invokes
1acf0 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64   the.** xBestInd
1ad00 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64  ex method and ad
1ad10 64 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ds the returned 
1ad20 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72  plan to pBuilder
1ad30 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72  ..**.** A constr
1ad40 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75  aint is marked u
1ad50 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  sable if:.**.** 
1ad60 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73    * Argument mUs
1ad70 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74  able indicates t
1ad80 68 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69  hat its prerequi
1ad90 73 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61  sites are availa
1ada0 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ble, and.**.**  
1adb0 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65   * It is not one
1adc0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1add0 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
1ade0 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b  he mExclude mask
1adf0 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61   passed.**     a
1ae00 73 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  s the fourth arg
1ae10 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20  ument (which in 
1ae20 70 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68  practice is eith
1ae30 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a  er WO_IN or 0)..
1ae40 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d  **.** Argument m
1ae50 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b  Prereq is a mask
1ae60 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
1ae70 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1ae80 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69  before the.** vi
1ae90 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71  rtual table in q
1aea0 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61  uestion. These a
1aeb0 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
1aec0 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69  plans prerequisi
1aed0 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74  tes.** before it
1aee0 20 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75   is added to pBu
1aef0 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74  ilder..**.** Out
1af00 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
1af10 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72  bIn is set to tr
1af20 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61  ue if the plan a
1af30 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1af40 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  .** uses one or 
1af50 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73  more WO_IN terms
1af60 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
1af70 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1af80 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1af90 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68  VirtualOne(.  Wh
1afa0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1afb0 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d  pBuilder,.  Bitm
1afc0 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20  ask mPrereq,    
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1afe0 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
1aff0 61 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e  at must be used.
1b000 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
1b010 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  sable,          
1b020 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1b030 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a   usable tables *
1b040 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65  /.  u16 mExclude
1b050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b060 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74      /* Exclude t
1b070 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65  erms using these
1b080 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
1b090 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1b0a0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20  fo *pIdxInfo,   
1b0b0 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a  /* Populated obj
1b0c0 65 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64  ect for xBestInd
1b0d0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f  ex */.  u16 mNoO
1b0e0 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mit,            
1b0f0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1b100 74 20 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e  t omit these con
1b110 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
1b120 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20  t *pbIn         
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b140 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c   OUT: True if pl
1b150 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  an uses an IN(..
1b160 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68  .) op */.){.  Wh
1b170 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
1b180 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1b190 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
1b1a0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1b1b0 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
1b1c0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1b1d0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
1b1e0 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70  sage *pUsage = p
1b1f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b200 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74  aintUsage;.  int
1b210 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d   i;.  int mxTerm
1b220 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b230 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
1b240 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69  oop *pNew = pBui
1b250 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61  lder->pNew;.  Pa
1b260 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42  rse *pParse = pB
1b270 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
1b280 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74  pParse;.  struct
1b290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b2a0 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d  Src = &pBuilder-
1b2b0 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
1b2c0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
1b2d0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
1b2e0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
1b2f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  nConstraint;..  
1b300 61 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65  assert( (mUsable
1b310 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72   & mPrereq)==mPr
1b320 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20  ereq );.  *pbIn 
1b330 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  = 0;.  pNew->pre
1b340 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a  req = mPrereq;..
1b350 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61    /* Set the usa
1b360 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  ble flag on the 
1b370 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72  subset of constr
1b380 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64  aints identified
1b390 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65   by .  ** argume
1b3a0 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20  nts mUsable and 
1b3b0 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70  mExclude. */.  p
1b3c0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1b3d0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b3e0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1b3f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b400 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1b410 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b420 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1b430 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
1b440 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
1b450 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d  [pIdxCons->iTerm
1b460 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64  Offset];.    pId
1b470 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
1b480 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  0;.    if( (pTer
1b490 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
1b4a0 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d   mUsable)==pTerm
1b4b0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20  ->prereqRight . 
1b4c0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
1b4d0 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c  Operator & mExcl
1b4e0 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  ude)==0.    ){. 
1b4f0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
1b500 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  sable = 1;.    }
1b510 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
1b520 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
1b530 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
1b540 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1b550 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  o structure */. 
1b560 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
1b570 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
1b580 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74  [0])*nConstraint
1b590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
1b5a0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1b5b0 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20  eIdxStr==0 );.  
1b5c0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1b5d0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1b5e0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
1b5f0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1b600 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
1b610 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
1b620 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
1b630 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
1b640 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66  ble)2;.  pIdxInf
1b650 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
1b660 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66   = 25;.  pIdxInf
1b670 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b  o->idxFlags = 0;
1b680 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c  .  pIdxInfo->col
1b690 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  Used = (sqlite3_
1b6a0 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55  int64)pSrc->colU
1b6b0 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  sed;..  /* Invok
1b6c0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
1b6d0 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  ble xBestIndex()
1b6e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20   method */.  rc 
1b6f0 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
1b700 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54  pParse, pSrc->pT
1b710 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
1b720 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b730 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d   rc;..  mxTerm =
1b740 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70   -1;.  assert( p
1b750 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
1b760 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f  nstraint );.  fo
1b770 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1b780 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
1b790 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
1b7a0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1b7b0 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  mitMask = 0;.  p
1b7c0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1b7d0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b7e0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1b7f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b800 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1b810 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b820 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1b830 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b  {.    int iTerm;
1b840 0a 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20  .    if( (iTerm 
1b850 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
1b860 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
1b870 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1b880 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69   *pTerm;.      i
1b890 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d  nt j = pIdxCons-
1b8a0 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
1b8b0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
1b8c0 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
1b8d0 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
1b8e0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
1b8f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
1b900 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
1b910 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  0.       || pIdx
1b920 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a  Cons->usable==0.
1b930 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1b940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1b950 4f 52 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  OR;.        sqli
1b960 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b970 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65  se,"%s.xBestInde
1b980 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70  x malfunction",p
1b990 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
1b9a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1b9b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1b9c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1b9d0 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
1b9e0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
1b9f0 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
1ba00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1ba10 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
1ba20 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
1ba30 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
1ba40 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
1ba50 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1ba60 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
1ba70 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
1ba80 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
1ba90 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
1baa0 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
1bab0 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
1bac0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
1bad0 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  erm;.      testc
1bae0 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
1baf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bb00 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
1bb10 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
1bb20 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
1bb30 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
1bb40 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
1bb50 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  <<iTerm;.      i
1bb60 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1bb70 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
1bb80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1bb90 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
1bba0 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
1bbb0 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
1bbc0 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
1bbd0 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
1bbe0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1bbf0 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
1bc00 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
1bc10 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  rms.        ** i
1bc20 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1bc30 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
1bc40 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
1bc50 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
1bc60 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
1bc70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
1bc80 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
1bc90 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
1bca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65  .        ** toge
1bcb0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
1bcc0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
1bcd0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
1bce0 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
1bcf0 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e  o->idxFlags &= ~
1bd00 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1bd10 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  N_UNIQUE;.      
1bd20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73    *pbIn = 1; ass
1bd30 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26  ert( (mExclude &
1bd40 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20   WO_IN)==0 );.  
1bd50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bd60 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1bd70 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f  mitMask &= ~mNoO
1bd80 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c  mit;..  pNew->nL
1bd90 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
1bda0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1bdb0 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
1bdc0 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d  LSlot );.  pNew-
1bdd0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d  >u.vtab.idxNum =
1bde0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1bdf0 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  m;.  pNew->u.vta
1be00 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
1be10 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1be20 65 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49  eIdxStr;.  pIdxI
1be30 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1be40 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65  dxStr = 0;.  pNe
1be50 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
1be60 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1be70 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  Str;.  pNew->u.v
1be80 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  tab.isOrdered = 
1be90 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f  (i8)(pIdxInfo->o
1bea0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f  rderByConsumed ?
1beb0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
1bec0 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a  >nOrderBy : 0);.
1bed0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1bee0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e   0;.  pNew->rRun
1bef0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1bf00 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
1bf10 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1bf20 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  st);.  pNew->nOu
1bf30 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
1bf40 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
1bf50 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f  matedRows);..  /
1bf60 2a 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f  * Set the WHERE_
1bf70 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74  ONEROW flag if t
1bf80 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  he xBestIndex() 
1bf90 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64  method indicated
1bfa0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1bfb0 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61  can will visit a
1bfc0 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20  t most one row. 
1bfd0 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69  Clear it otherwi
1bfe0 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  se. */.  if( pId
1bff0 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1c000 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  & SQLITE_INDEX_S
1c010 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20  CAN_UNIQUE ){.  
1c020 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1c030 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
1c040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1c050 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  ew->wsFlags &= ~
1c060 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1c070 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  }.  rc = whereLo
1c080 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1c090 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  r, pNew);.  if( 
1c0a0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1c0b0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  dFree ){.    sql
1c0c0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
1c0d0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
1c0e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1c0f0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1c100 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
1c110 30 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d  0xffff, ("  bIn=
1c120 25 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c  %d prereqIn=%04l
1c130 6c 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34  lx prereqOut=%04
1c140 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llx\n",.        
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
1c160 62 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  bIn, (sqlite3_ui
1c170 6e 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20  nt64)mPrereq,.  
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e      (sqlite3_uin
1c1a0 74 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65  t64)(pNew->prere
1c1b0 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b  q & ~mPrereq)));
1c1c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c1d0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  .../*.** Add all
1c1e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1c1f0 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
1c200 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
1c210 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
1c220 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1c230 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
1c240 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1c250 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
1c260 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1c270 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72  e are no LEFT or
1c280 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e   CROSS JOIN join
1c290 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20  s in the query, 
1c2a0 62 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64  both mPrereq and
1c2b0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72  .** mUnusable ar
1c2c0 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65  e set to 0. Othe
1c2d0 72 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69  rwise, mPrereq i
1c2e0 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
1c2f0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
1c300 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
1c310 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
1c320 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
1c330 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
1c340 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
1c350 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1c360 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1c370 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
1c380 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
1c390 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
1c3a0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
1c3b0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
1c3c0 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
1c3d0 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
1c3e0 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
1c3f0 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
1c400 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
1c410 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
1c420 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
1c430 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1c440 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
1c450 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
1c460 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
1c470 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
1c480 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
1c490 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72  **.** then mPrer
1c4a0 65 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  eq corresponds t
1c4b0 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d  o (t1, t2) and m
1c4c0 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c  Unusable to (t5,
1c4d0 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20   t6)..**.** All 
1c4e0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50  the tables in mP
1c4f0 72 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63  rereq must be sc
1c500 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1c510 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1c520 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61   .** table. So a
1c530 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1c540 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73  ch all prerequis
1c550 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69  ites are satisfi
1c560 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65  ed by .** mPrere
1c570 71 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  q may be specifi
1c580 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
1c590 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
1c5a0 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
1c5b0 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
1c5c0 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
1c5d0 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
1c5e0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
1c5f0 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
1c600 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
1c610 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
1c620 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
1c630 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
1c640 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
1c650 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
1c660 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
1c670 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
1c680 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1c690 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1c6a0 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
1c6b0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1c6c0 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
1c6d0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
1c6e0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
1c6f0 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20   mPrereq,       
1c700 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1c710 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1c720 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
1c730 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
1c740 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
1c750 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
1c760 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1c770 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
1c780 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   one */.){.  int
1c790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c7b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68  urn code */.  Wh
1c7c0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1c7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
1c7e0 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
1c7f0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
1c800 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1c810 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1c820 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c830 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1c840 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
1c850 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1c860 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1c870 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1c880 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1c890 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1c8a0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c   search */.  sql
1c8b0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1c8c0 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a  *p;       /* Obj
1c8d0 65 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ect to pass to x
1c8e0 42 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20  BestIndex() */. 
1c8f0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1c900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c910 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1c920 72 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20  raints in p */. 
1c930 20 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20   int bIn;       
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c950 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1c960 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  es IN(...) opera
1c970 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  tor */.  WhereLo
1c980 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d  op *pNew;.  Bitm
1c990 61 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20  ask mBest;      
1c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1c9b0 65 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20  es used by best 
1c9c0 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f  possible plan */
1c9d0 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a  .  u16 mNoOmit;.
1c9e0 0a 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65  .  assert( (mPre
1c9f0 72 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29  req & mUnusable)
1ca00 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20  ==0 );.  pWInfo 
1ca10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1ca20 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
1ca30 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ca40 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
1ca50 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
1ca60 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1ca70 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
1ca80 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
1ca90 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65  w->iTab];.  asse
1caa0 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53  rt( IsVirtual(pS
1cab0 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70  rc->pTab) );.  p
1cac0 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
1cad0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
1cae0 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72  , mUnusable, pSr
1caf0 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  c, pBuilder->pOr
1cb00 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d  derBy, .      &m
1cb10 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70  NoOmit);.  if( p
1cb20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1cb30 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1cb40 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1cb50 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
1cb60 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
1cb70 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
1cb80 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
1cb90 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1cba0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f  dFree = 0;.  nCo
1cbb0 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43  nstraint = p->nC
1cbc0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
1cbd0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
1cbe0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65  (pParse->db, pNe
1cbf0 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
1cc00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1cc10 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1cc20 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   p);.    return 
1cc30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1cc40 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  T;.  }..  /* Fir
1cc50 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64  st call xBestInd
1cc60 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f  ex() with all co
1cc70 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
1cc80 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  . */.  WHERETRAC
1cc90 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1cca0 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1ccb0 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20  le\n"));.  rc = 
1ccc0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1ccd0 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1cce0 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1ccf0 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  S, 0, p, mNoOmit
1cd00 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49  , &bIn);..  /* I
1cd10 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42  f the call to xB
1cd20 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20  estIndex() with 
1cd30 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65  all terms enable
1cd40 64 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61  d produced a pla
1cd50 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73  n.  ** that does
1cd60 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
1cd70 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28   source tables (
1cd80 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68  IOW: a plan with
1cd90 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a   mBest==0),.  **
1cda0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
1cdb0 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e  o point in makin
1cdc0 67 20 61 6e 79 20 66 75 72 74 68 65 72 20 63 61  g any further ca
1cdd0 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1cde0 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  x() .  ** since 
1cdf0 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65  they will all re
1ce00 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65  turn the same re
1ce10 73 75 6c 74 20 28 69 66 20 74 68 65 20 78 42 65  sult (if the xBe
1ce20 73 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69  stIndex().  ** i
1ce30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
1ce40 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28   sane). */.  if(
1ce50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ce60 26 20 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77  & (mBest = (pNew
1ce70 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65  ->prereq & ~mPre
1ce80 72 65 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  req))!=0 ){.    
1ce90 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30  int seenZero = 0
1cea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ceb0 20 54 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20   True if a plan 
1cec0 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20  with no prereqs 
1ced0 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  seen */.    int 
1cee0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30  seenZeroNoIN = 0
1cef0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;         /* Pla
1cf00 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71  n with no prereq
1cf10 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29  s and no IN(...)
1cf20 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74   seen */.    Bit
1cf30 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a  mask mPrev = 0;.
1cf40 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73      Bitmask mBes
1cf50 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  tNoIn = 0;..    
1cf60 2f 2a 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70  /* If the plan p
1cf70 72 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 65  roduced by the e
1cf80 61 72 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73  arlier call uses
1cf90 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d   an IN(...) term
1cfa0 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42  , call.    ** xB
1cfb0 65 73 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20  estIndex again, 
1cfc0 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 49  this time with I
1cfd0 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73  N(...) terms dis
1cfe0 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  abled. */.    if
1cff0 28 20 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57  ( bIn ){.      W
1d000 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1d010 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1d020 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49  all usable w/o I
1d030 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  N\n"));.      rc
1d040 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1d050 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1d060 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1d070 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c  Prereq, ALLBITS,
1d080 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d   WO_IN, p, mNoOm
1d090 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1d0a0 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20   assert( bIn==0 
1d0b0 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f  );.      mBestNo
1d0c0 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  In = pNew->prere
1d0d0 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20  q & ~mPrereq;.  
1d0e0 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49      if( mBestNoI
1d0f0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1d100 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1d110 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f        seenZeroNo
1d120 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1d130 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
1d140 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e  ll xBestIndex on
1d150 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ce for each dist
1d160 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70  inct value of (p
1d170 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1d180 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69  rereq) .    ** i
1d190 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72  n the set of ter
1d1a0 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f  ms that apply to
1d1b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1d1c0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  tual table.  */.
1d1d0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
1d1e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d1f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42    int i;.      B
1d200 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41  itmask mNext = A
1d210 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73  LLBITS;.      as
1d220 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b  sert( mNext>0 );
1d230 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d240 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1d250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
1d260 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20  mask mThis = (. 
1d270 20 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e             pWC->
1d280 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  a[p->aConstraint
1d290 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d  [i].iTermOffset]
1d2a0 2e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e  .prereqRight & ~
1d2b0 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20  mPrereq.        
1d2c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1d2d0 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54  This>mPrev && mT
1d2e0 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78  his<mNext ) mNex
1d2f0 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20  t = mThis;.     
1d300 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d   }.      mPrev =
1d310 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66   mNext;.      if
1d320 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53  ( mNext==ALLBITS
1d330 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1d340 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74  if( mNext==mBest
1d350 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74   || mNext==mBest
1d360 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NoIn ) continue;
1d370 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1d380 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1d390 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30  ualOne: mPrev=%0
1d3a0 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c  4llx mNext=%04ll
1d3b0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1d3d0 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72  lite3_uint64)mPr
1d3e0 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  ev, (sqlite3_uin
1d3f0 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20  t64)mNext));.   
1d400 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1d410 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1d420 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1d430 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65  er, mPrereq, mNe
1d440 78 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70  xt|mPrereq, 0, p
1d450 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d460 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
1d470 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65  ->prereq==mPrere
1d480 71 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  q ){.        see
1d490 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  nZero = 1;.     
1d4a0 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20     if( bIn==0 ) 
1d4b0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1d4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d4d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
1d4e0 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1d4f0 65 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76  ex() in the abov
1d500 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66  e loop did not f
1d510 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a  ind a plan.    *
1d520 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  * that requires 
1d530 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  no source tables
1d540 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e   at all (i.e. on
1d550 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1d560 62 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  be.    ** usable
1d570 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68  ), make a call h
1d580 65 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75  ere with all sou
1d590 72 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62  rce tables disab
1d5a0 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  led */.    if( r
1d5b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d5c0 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20  seenZero==0 ){. 
1d5d0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1d5e0 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1d5f0 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c  lOne: all disabl
1d600 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  ed\n"));.      r
1d610 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1d620 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1d630 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1d640 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71  mPrereq, mPrereq
1d650 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  , 0, p, mNoOmit,
1d660 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1d670 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a  ( bIn==0 ) seenZ
1d680 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1d690 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d6a0 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1d6b0 49 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20  Index() have so 
1d6c0 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69  far failed to fi
1d6d0 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1d6e0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1d6f0 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1d700 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20  at all and does 
1d710 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e  not use an IN(..
1d720 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .).    ** operat
1d730 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c  or, make a final
1d740 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20   call to obtain 
1d750 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  one here.  */.  
1d760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d770 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e  _OK && seenZeroN
1d780 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIN==0 ){.      
1d790 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1d7a0 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1d7b0 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e   all disabled an
1d7c0 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20  d w/o IN\n"));. 
1d7d0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1d7e0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1d7f0 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1d800 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1d810 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70  Prereq, WO_IN, p
1d820 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1d840 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  f( p->needToFree
1d850 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
1d860 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29  _free(p->idxStr)
1d870 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d880 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eNN(pParse->db, 
1d890 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d8a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1d8b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d8c0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
1d8d0 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
1d8e0 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
1d8f0 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
1d900 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
1d910 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
1d920 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
1d930 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1d940 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68  eLoopAddOr(.  Wh
1d950 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1d960 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74  pBuilder, .  Bit
1d970 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20  mask mPrereq, . 
1d980 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1d990 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  le.){.  WhereInf
1d9a0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1d9b0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1d9c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1d9d0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1d9e0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
1d9f0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
1da00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1da10 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
1da20 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
1da30 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
1da40 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
1da50 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
1da60 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
1da70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1da80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1da90 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
1daa0 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
1dab0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
1dac0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
1dad0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1dae0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
1daf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
1db00 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
1db10 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1db20 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
1db30 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
1db40 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
1db50 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
1db60 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
1db70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
1db80 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
1db90 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1dba0 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
1dbb0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
1dbc0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
1dbd0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
1dbe0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
1dbf0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1dc00 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
1dc10 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1dc20 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
1dc30 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
1dc40 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
1dc50 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
1dc60 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
1dc70 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
1dc80 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1dc90 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
1dca0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
1dcb0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
1dcc0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
1dcd0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
1dce0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1dcf0 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
1dd00 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
1dd10 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
1dd20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
1dd30 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1dd40 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
1dd50 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
1dd60 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
1dd70 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
1dd80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
1dd90 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1dda0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1ddb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
1ddc0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
1ddd0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
1dde0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
1ddf0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
1de00 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1de10 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
1de20 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
1de30 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
1de40 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
1de50 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
1de60 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
1de70 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
1de80 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
1de90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
1dea0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
1deb0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
1dec0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
1ded0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
1dee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1def0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1df00 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
1df10 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
1df20 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1df30 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
1df40 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
1df50 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
1df60 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
1df70 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
1df80 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
1df90 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
1dfa0 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
1dfb0 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
1dfc0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1dfd0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
1dfe0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
1dff0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
1e000 61 75 73 65 50 72 69 6e 74 28 73 53 75 62 42 75  ausePrint(sSubBu
1e010 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  ild.pWC);.      
1e020 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1e030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1e040 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1e050 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1e060 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1e070 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e080 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1e090 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
1e0a0 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1e0b0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ble);.        }e
1e0c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1e0d0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
1e0e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e0f0 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
1e100 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20  , mPrereq);.    
1e110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1e120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e140 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1e150 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1e160 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1e170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e180 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1e190 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
1e1a0 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
1e1b0 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
1e1c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1e1d0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1e1e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e1f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
1e200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
1e210 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
1e220 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
1e230 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1e240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e250 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
1e260 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
1e270 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1e280 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
1e290 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1e2a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
1e2b0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
1e2c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e2d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
1e2e0 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
1e2f0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
1e300 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
1e310 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
1e320 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
1e330 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1e360 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
1e370 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
1e380 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1e3b0 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
1e3c0 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
1e3d0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
1e3e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1e3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e400 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
1e410 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
1e420 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1e430 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
1e440 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1e450 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
1e460 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1e470 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
1e480 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1e490 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
1e4a0 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
1e4b0 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
1e4c0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1e4d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
1e4e0 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
1e4f0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
1e500 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
1e510 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
1e520 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
1e530 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
1e540 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
1e550 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
1e560 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
1e570 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
1e580 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
1e590 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
1e5a0 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
1e5b0 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
1e5c0 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
1e5d0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
1e5e0 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
1e5f0 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
1e600 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
1e610 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
1e620 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
1e630 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
1e640 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
1e650 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
1e660 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
1e670 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
1e680 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
1e690 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
1e6a0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
1e6b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
1e6c0 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
1e6d0 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
1e6e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1e6f0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
1e700 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
1e710 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
1e720 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e730 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
1e740 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
1e750 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
1e760 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
1e770 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1e780 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
1e790 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
1e7a0 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
1e7b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1e7c0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
1e7d0 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
1e7e0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
1e7f0 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
1e800 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1e810 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
1e820 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
1e830 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1e840 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1e850 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e860 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1e870 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
1e880 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1e890 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1e8a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e8b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1e8c0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1e8d0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
1e8e0 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
1e8f0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1e900 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
1e910 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1e920 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1e930 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1e940 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
1e950 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30  mask mPrereq = 0
1e960 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1e970 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1e980 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1e990 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1e9a0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1e9b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e9c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1e9d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e9e0 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1e9f0 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1ea00 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1ea10 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1ea20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1ea30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ea40 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1ea50 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1ea60 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1ea70 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1ea80 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1ea90 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1eaa0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1eab0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1eac0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1ead0 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1eae0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1eaf0 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1eb00 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1eb10 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1eb20 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1eb30 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1eb40 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1eb50 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1eb60 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1eb70 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1eb80 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1eb90 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1eba0 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1ebb0 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1ebc0 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1ebd0 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1ebe0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1ebf0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1ec00 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1ec10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1ec20 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1ec30 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1ec40 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1ec50 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1ec60 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d       mPrereq = m
1ec70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
1ec80 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1ec90 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
1eca0 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ype;.#ifndef SQL
1ecb0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1ecc0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
1ecd0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
1ece0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74  Tab) ){.      st
1ecf0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ed00 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  m *p;.      for(
1ed10 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70  p=&pItem[1]; p<p
1ed20 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
1ed30 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65     if( mUnusable
1ed40 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74   || (p->fg.joint
1ed50 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1ed60 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20  T_CROSS)) ){.   
1ed70 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65         mUnusable
1ed80 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
1ed90 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
1eda0 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43  >sMaskSet, p->iC
1edb0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
1edc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1edd0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1ede0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
1edf0 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  r, mPrereq, mUnu
1ee00 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1ee10 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1ee20 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ee30 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  ABLE */.    {.  
1ee40 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ee50 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
1ee60 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  der, mPrereq);. 
1ee70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1ee80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ee90 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1eea0 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
1eeb0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1eec0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1eed0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1eee0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1eef0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1ef00 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1ef10 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1ef20 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1ef30 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1ef40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1ef50 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1ef60 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1ef70 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1ef80 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 36  ereLoop of the 6
1ef90 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1efa0 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1efb0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1efc0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1efd0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1efe0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1eff0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1f000 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1f010 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1f020 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1f030 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1f040 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1f050 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1f060 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1f070 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1f080 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1f090 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1f0a0 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1f0b0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1f0c0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1f0d0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1f0e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1f0f0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1f100 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1f110 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1f120 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1f130 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1f140 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1f150 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1f160 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1f170 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1f180 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1f190 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1f1a0 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1f1b0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1f1c0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1f1d0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1f1e0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1f1f0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1f200 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1f210 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1f220 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1f230 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1f240 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1f250 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1f260 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1f270 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1f280 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1f290 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1f2a0 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1f2b0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1f2c0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1f2d0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1f2e0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1f2f0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1f300 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1f310 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1f320 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f330 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1f340 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1f350 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1f360 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1f370 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1f380 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1f390 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1f3a0 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1f3b0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1f3c0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1f3d0 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  * WHERE_GROUPBY 
1f3e0 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f  or _DISTINCTBY o
1f3f0 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  r _ORDERBY_LIMIT
1f400 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
1f410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f420 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1f430 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
1f440 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
1f450 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
1f460 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
1f470 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
1f480 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
1f490 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
1f4a0 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
1f4b0 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
1f4c0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
1f4d0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1f4e0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
1f4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1f500 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
1f510 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
1f520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f530 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
1f540 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1f550 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
1f560 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
1f570 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
1f580 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
1f590 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
1f5a0 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
1f5b0 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
1f5c0 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
1f5d0 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
1f5e0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
1f5f0 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
1f600 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
1f610 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
1f620 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
1f630 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
1f640 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f650 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f  use */.  u16 eqO
1f660 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f  pMask;         /
1f670 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69  * Allowed equali
1f680 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1f690 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
1f6a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f6b0 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
1f6c0 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
1f6d0 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
1f6e0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1f6f0 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
1f700 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1f710 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
1f720 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1f730 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
1f740 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1f750 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1f760 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
1f770 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
1f780 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
1f790 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
1f7a0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f7c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1f7d0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f7f0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
1f800 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f810 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1f820 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1f830 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
1f840 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
1f850 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f860 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
1f870 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f880 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
1f890 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1f8a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
1f8b0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1f8c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1f8d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
1f8e0 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
1f8f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
1f900 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
1f910 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
1f920 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1f930 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
1f940 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
1f950 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1f960 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
1f970 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
1f980 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
1f990 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
1f9a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1f9b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1f9c0 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
1f9d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1f9e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
1f9f0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
1fa00 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
1fa10 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
1fa20 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
1fa30 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
1fa40 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
1fa50 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
1fa60 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
1fa70 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
1fa80 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
1fa90 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
1faa0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
1fab0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
1fac0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
1fad0 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
1fae0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
1faf0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
1fb00 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
1fb10 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
1fb20 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
1fb30 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
1fb40 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
1fb50 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
1fb60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1fb70 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
1fb80 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
1fb90 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
1fba0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
1fbb0 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
1fbc0 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
1fbd0 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
1fbe0 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
1fbf0 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
1fc00 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
1fc10 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
1fc20 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
1fc30 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
1fc40 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
1fc50 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
1fc60 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
1fc70 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1fc80 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
1fc90 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
1fca0 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
1fcb0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
1fcc0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1fcd0 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
1fce0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
1fcf0 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
1fd00 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
1fd10 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
1fd20 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
1fd30 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
1fd40 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
1fd50 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
1fd60 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1fd70 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
1fd80 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1fd90 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
1fda0 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
1fdb0 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
1fdc0 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
1fdd0 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
1fde0 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
1fdf0 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
1fe00 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
1fe10 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
1fe20 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
1fe30 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
1fe40 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1fe50 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
1fe60 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
1fe70 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
1fe80 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
1fe90 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
1fea0 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
1feb0 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
1fec0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1fed0 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
1fee0 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
1fef0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
1ff00 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
1ff10 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
1ff20 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
1ff30 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
1ff40 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
1ff50 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
1ff60 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
1ff70 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
1ff80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
1ff90 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
1ffa0 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
1ffb0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1ffc0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
1ffd0 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
1ffe0 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
1fff0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
20000 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
20010 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
20020 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
20030 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
20040 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
20050 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
20060 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
20070 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
20080 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
20090 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
200a0 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
200b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
200c0 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
200d0 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f  .  eqOpMask = WO
200e0 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f  _EQ | WO_IS | WO
200f0 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77  _ISNULL;.  if( w
20100 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
20110 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
20120 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f  ) eqOpMask |= WO
20130 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  _IN;.  for(iLoop
20140 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
20150 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
20160 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
20170 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
20180 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
20190 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
201a0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
201b0 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29  f( iLoop<nLoop )
201c0 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  {.      pLoop = 
201d0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
201e0 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77  op];.      if( w
201f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
20200 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
20210 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f  }else{.      pLo
20230 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  op = pLast;.    
20240 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
20250 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
20260 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
20270 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
20280 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
20290 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
202a0 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
202b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
202c0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
202d0 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b 0a 20  e.nIdxCol = 0;. 
202e0 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
202f0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
20300 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
20310 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
20320 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
20330 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
20340 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
20350 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
20360 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
20370 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
20380 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
20390 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
203a0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
203b0 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
203c0 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
203d0 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
203e0 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
203f0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
20400 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
20410 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
20420 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
20430 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
20440 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
20450 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
20460 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
20470 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
20480 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
20490 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
204a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
204b0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
204c0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
204d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
204e0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
204f0 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
20500 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
20510 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71        ~ready, eq
20540 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20  OpMask, 0);.    
20550 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
20560 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20570 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
20580 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a  rator==WO_IN ){.
20590 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65          /* IN te
205a0 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c  rms are only val
205b0 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69  id for sorting i
205c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c  n the ORDER BY L
205d0 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a  IMIT .        **
205e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61   optimization, a
205f0 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20  nd then only if 
20600 74 68 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c  they are actuall
20610 79 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  y used.        *
20620 2a 20 62 79 20 74 68 65 20 71 75 65 72 79 20 70  * by the query p
20630 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  lan */.        a
20640 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
20650 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
20660 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20  Y_LIMIT );.     
20670 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
20680 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
20690 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  Term!=pLoop->aLT
206a0 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20  erm[j]; j++){}. 
206b0 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c         if( j>=pL
206c0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f  oop->nLTerm ) co
206d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
206e0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
206f0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
20700 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
20710 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
20720 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
20730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
20740 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
20750 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
20760 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
20770 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
20780 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20790 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
207a0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
207b0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
207c0 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
207d0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
207e0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
207f0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
20800 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
20810 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20820 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
20830 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
20840 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
20850 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
20860 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20870 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
20880 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
20890 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
208a0 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
208b0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
208c0 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
208d0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
208e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
208f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
20900 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
20910 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
20920 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20930 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
20940 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
20950 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
20960 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
20970 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
20980 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
20990 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
209a0 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
209b0 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
209c0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
209d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
209e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
209f0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
20a00 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
20a10 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
20a20 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
20a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
20a40 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
20a50 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20a60 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
20a70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20a80 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20a90 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e  n[nColumn-1]==XN
20aa0 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20ad0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
20ae0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
20af0 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
20b00 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
20b10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20b20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
20b30 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
20b40 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
20b50 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
20b60 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
20b70 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
20b80 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
20b90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
20ba0 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
20bb0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
20bc0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
20bd0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
20be0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
20bf0 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b     u8 bOnce = 1;
20c00 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
20c10 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
20c20 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
20c30 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d       assert( j>=
20c40 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
20c50 45 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Eq .            
20c60 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  || (pLoop->aLTer
20c70 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f  m[j]==0)==(j<pLo
20c80 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20  op->nSkip).     
20c90 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
20ca0 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
20cb0 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f  ee.nEq && j>=pLo
20cc0 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  op->nSkip ){.   
20cd0 20 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d         u16 eOp =
20ce0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
20cf0 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20  ]->eOperator;.. 
20d00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
20d10 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
20d20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73  and ISNULL terms
20d30 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e  .  (Also skip IN
20d40 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20   terms when.    
20d50 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57        ** doing W
20d60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
20d70 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20  IT processing). 
20d80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
20d90 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
20da0 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
20db0 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  s a column of an
20dc0 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45   ((?,?) IN (SELE
20dd0 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20  CT...)) .       
20de0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
20df0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53   for which the S
20e00 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f  ELECT returns mo
20e10 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
20e20 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mn,.          **
20e30 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
20e40 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d  s the only colum
20e50 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c  n used by this l
20e60 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  oop. Otherwise,.
20e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
20e80 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f  it is one of two
20e90 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f   or more, none o
20ea0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61  f the columns ca
20eb0 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  n be.          *
20ec0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
20ed0 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42  match an ORDER B
20ee0 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  Y term.  */.    
20ef0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
20f00 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b   eqOpMask)!=0 ){
20f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20f20 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
20f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20f40 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
20f50 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
20f70 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
20f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
20f90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
20fa0 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
20fb0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
20fc0 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  YS(eOp & WO_IN) 
20fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
20fe0 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69  * ALWAYS() justi
20ff0 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73  fication: eOp is
21000 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65   an equality ope
21010 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65  rator due to the
21020 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21030 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
21040 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20  .nEq constraint 
21050 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61  above.  Any equa
21060 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20  lity other.     
21070 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57         ** than W
21080 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64  O_IN is captured
21090 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
210a0 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20   "if".  So this 
210b0 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
210c0 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f  ** always has to
210d0 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20   be WO_IN. */.  
210e0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
210f0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
21100 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20  rm[j]->pExpr;.  
21110 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
21120 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e  j+1; i<pLoop->u.
21130 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b  btree.nEq; i++){
21140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21150 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  f( pLoop->aLTerm
21160 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29  [i]->pExpr==pX )
21170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21180 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
21190 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70  ->aLTerm[i]->eOp
211a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20  erator & WO_IN) 
211b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
211c0 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20     bOnce = 0;.  
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
211e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
211f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21210 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21220 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
21230 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
21240 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
21250 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
21260 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
21270 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
21280 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
21290 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
212a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
212b0 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
212c0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
212d0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
212e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
212f0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
21300 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
21310 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
21320 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
21330 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
21340 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
21350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21360 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f   iColumn = XN_RO
21370 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72  WID;.          r
21380 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
21390 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
213a0 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
213b0 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
213c0 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
213d0 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
213e0 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
213f0 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
21400 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
21410 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
21420 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
21430 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
21440 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
21450 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
21460 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
21470 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
21480 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
21490 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
214a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
214b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
214c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
214d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
214e0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
214f0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
21500 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
21510 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
21520 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
21530 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
21540 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
21550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21560 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
21570 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
21580 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
21590 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
215a0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
215b0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
215c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
215d0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
215e0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
215f0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
21600 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
21610 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
21620 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21630 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
21640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
21650 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21660 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
21670 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
21680 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
21690 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
216a0 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
216b0 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
216c0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
216d0 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20  umn>=(-1) ){.   
216e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
216f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
21700 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
21710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21720 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
21730 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
21740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21750 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
21760 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
21770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21790 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
217a0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20  ExprCompare(0,. 
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 70 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d   pOBExpr,pIndex-
217d0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
217e0 70 45 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20  pExpr,iCur) ){. 
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
21800 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
21820 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21830 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49 44  Column!=XN_ROWID
21840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21850 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
21860 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
21870 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
21880 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
21890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
218a0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
218b0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
218c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
218d0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
218e0 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
218f0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
21900 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
21910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21920 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
21930 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20  btree.nIdxCol = 
21940 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  j+1;.          i
21950 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
21960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21980 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
21990 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
219a0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
219b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
219c0 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
219d0 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
219e0 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
219f0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
21a00 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
21a10 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
21a20 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
21a30 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
21a40 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
21a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21a60 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
21a70 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
21a80 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
21a90 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
21aa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21ab0 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
21ac0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
21ad0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
21ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21af0 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
21b00 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
21b10 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
21b20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
21b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21b40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
21b50 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
21b60 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
21b70 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  =XN_ROWID ){.   
21b80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21b90 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  e( distinctColum
21ba0 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ns==0 );.       
21bb0 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
21bc0 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  umns = 1;.      
21bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21be0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
21bf0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  (i);.        }el
21c00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
21c10 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20   No match found 
21c20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
21c30 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43   j==0 || j<nKeyC
21c40 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
21c50 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
21c60 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29  derDistinct!=0 )
21c70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
21c80 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
21c90 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
21ca0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21cc0 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76  } /* end Loop ov
21cd0 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  er all index col
21ce0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  umns */.      if
21cf0 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
21d00 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  s ){.        tes
21d10 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
21d20 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
21d30 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
21d40 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  inct = 1;.      
21d50 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69  }.    } /* end-i
21d60 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f  f not one-row */
21d70 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
21d80 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45  f any other ORDE
21d90 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
21da0 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20  reference pLoop 
21db0 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64  */.    if( isOrd
21dc0 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
21dd0 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63      orderDistinc
21de0 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  tMask |= pLoop->
21df0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
21e00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
21e10 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
21e20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
21e30 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72      Bitmask mTer
21e40 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  m;.        if( M
21e50 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
21e60 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
21e70 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72        p = pOrder
21e80 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
21e90 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20          mTerm = 
21ea0 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
21eb0 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73  Usage(&pWInfo->s
21ec0 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20  MaskSet,p);.    
21ed0 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30      if( mTerm==0
21ee0 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
21ef0 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20  IsConstant(p) ) 
21f00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21f10 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72    if( (mTerm&~or
21f20 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29  derDistinctMask)
21f30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
21f40 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
21f50 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T(i);.        }.
21f60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21f70 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f  } /* End the loo
21f80 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65  p over all Where
21f90 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72  Loops from outer
21fa0 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e  -most down to in
21fb0 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66  ner-most */.  if
21fc0 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
21fd0 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72  ) return (i8)nOr
21fe0 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73  derBy;.  if( !is
21ff0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
22000 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65  .    for(i=nOrde
22010 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  rBy-1; i>0; i--)
22020 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
22030 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d  m = MASKBIT(i) -
22040 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f   1;.      if( (o
22050 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74  bSat&m)==m ) ret
22060 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  urn i;.    }.   
22070 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
22080 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a   return -1;.}...
22090 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  /*.** If the WHE
220a0 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20  RE_GROUPBY flag 
220b0 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61  is set in the ma
220c0 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  sk passed to sql
220d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
220e0 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72  ,.** the planner
220f0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
22100 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64  e specified pOrd
22110 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74  erBy list is act
22120 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a  ually a GROUP.**
22130 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64   BY clause - and
22140 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68   so any order th
22150 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61  at groups rows a
22160 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73  s required satis
22170 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75  fies the.** requ
22180 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  est..**.** Norma
22190 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73  lly, in this cas
221a0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
221b0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c  ible for the cal
221c0 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ler to determine
221d0 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
221e0 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20  ot the rows are 
221f0 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c  really being del
22200 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64  ivered in sorted
22210 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75   order, or.** ju
22220 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  st in some other
22230 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76   order that prov
22240 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ides the require
22250 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65  d grouping. Howe
22260 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57  ver,.** if the W
22270 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
22280 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61   flag is also pa
22290 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
222a0 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65  hereBegin(), the
222b0 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
222c0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
222d0 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
222e0 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63   WhereInfo objec
222f0 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  t. It returns.**
22300 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
22310 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65  s really will be
22320 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73   sorted in the s
22330 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20  pecified order, 
22340 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65  or false.** othe
22350 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rwise..**.** For
22360 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
22370 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
22380 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
22390 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74  1(x, Y);.**.** t
223a0 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  hen.**.**   SELE
223b0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f  CT * FROM t1 GRO
223c0 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20  UP BY x,y ORDER 
223d0 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53  BY x,y;   -- IsS
223e0 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20  orted()==1.**   
223f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
22400 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52   GROUP BY y,x OR
22410 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d  DER BY y,x;   --
22420 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a   IsSorted()==0.*
22430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
22440 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65  reIsSorted(Where
22450 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
22460 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
22470 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
22480 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20  ERE_GROUPBY );. 
22490 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
224a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
224b0 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
224c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
224d0 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23  fo->sorted;.}..#
224e0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
224f0 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20  _ENABLED./* For 
22500 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
22510 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly: */.static co
22520 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50  nst char *whereP
22530 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74  athName(WherePat
22540 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c  h *pPath, int nL
22550 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  oop, WhereLoop *
22560 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63  pLast){.  static
22570 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b   char zName[65];
22580 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
22590 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b  i=0; i<nLoop; i+
225a0 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70  +){ zName[i] = p
225b0 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e  Path->aLoop[i]->
225c0 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61  cId; }.  if( pLa
225d0 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20  st ) zName[i++] 
225e0 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20  = pLast->cId;.  
225f0 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
22600 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
22610 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22620 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  turn the cost of
22630 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f   sorting nRow ro
22640 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  ws, assuming tha
22650 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20  t the keys have 
22660 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c  .** nOrderby col
22670 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68  umns and that th
22680 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20  e first nSorted 
22690 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65  columns are alre
226a0 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e  ady in.** order.
226b0 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
226c0 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  t whereSortingCo
226d0 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  st(.  WhereInfo 
226e0 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73  *pWInfo,.  LogEs
226f0 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f  t nRow,.  int nO
22700 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53  rderBy,.  int nS
22710 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55  orted.){.  /* TU
22720 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
22730 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65  cost of a full e
22740 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68  xternal sort, wh
22750 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74  ere N is .  ** t
22760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
22770 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20  s to sort is:.  
22780 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
22790 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
227a0 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  N))..  ** .  ** 
227b0 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72  Or, if the order
227c0 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58  -by clause has X
227d0 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20   terms but only 
227e0 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a  the last Y .  **
227f0 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f   terms are out o
22800 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c  f order, then bl
22810 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c  ock-sorting will
22820 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a   reduce the .  *
22830 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74  * sorting cost t
22840 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63  o:.  **.  **   c
22850 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
22860 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29   log(N)) * (Y/X)
22870 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28  .  **.  ** The (
22880 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70  Y/X) term is imp
22890 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73  lemented using s
228a0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53  tack variable rS
228b0 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e  cale.  ** below.
228c0 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53    */.  LogEst rS
228d0 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b  cale, rSortCost;
228e0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65  .  assert( nOrde
228f0 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c  rBy>0 && 66==sql
22900 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
22910 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71  );.  rScale = sq
22920 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72  lite3LogEst((nOr
22930 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31  derBy-nSorted)*1
22940 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36  00/nOrderBy) - 6
22950 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d  6;.  rSortCost =
22960 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b   nRow + rScale +
22970 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69   16;..  /* Multi
22980 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68  ple by log(M) wh
22990 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d  ere M is the num
229a0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
229b0 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65  ws..  ** Use the
229c0 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20   LIMIT for M if 
229d0 69 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f  it is smaller */
229e0 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
229f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
22a00 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30  RE_USE_LIMIT)!=0
22a10 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d   && pWInfo->iLim
22a20 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e  it<nRow ){.    n
22a30 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c  Row = pWInfo->iL
22a40 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72  imit;.  }.  rSor
22a50 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28  tCost += estLog(
22a60 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  nRow);.  return 
22a70 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a  rSortCost;.}../*
22a80 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69  .** Given the li
22a90 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  st of WhereLoop 
22aa0 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66  objects at pWInf
22ab0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20  o->pLoops, this 
22ac0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d  routine.** attem
22ad0 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  pts to find the 
22ae0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
22af0 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63   that visits eac
22b00 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f  h WhereLoop.** o
22b10 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20  nce.  This path 
22b20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69  is then loaded i
22b30 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e  nto the pWInfo->
22b40 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64  a[].pWLoop field
22b50 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20  s..**.** Assume 
22b60 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  that the total n
22b70 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
22b80 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  rows that will n
22b90 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64  eed to be sorted
22ba0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77  .** will be nRow
22bb0 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c  Est (in the 10*l
22bc0 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69  og2 representati
22bd0 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65  on).  Or, ignore
22be0 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74   sorting.** cost
22bf0 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e  s if nRowEst==0.
22c00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
22c10 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
22c20 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
22c30 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
22c40 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
22c50 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
22c60 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
22c70 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
22c80 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45  fo *pWInfo, LogE
22c90 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69  st nRowEst){.  i
22ca0 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20  nt mxChoice;    
22cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
22cc0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  mum number of si
22cd0 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73  multaneous paths
22ce0 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   tracked */.  in
22cf0 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t nLoop;        
22d00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22d10 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
22d20 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73  e join */.  Pars
22d30 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
22d40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
22d50 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
22d60 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
22d70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
22d80 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22d90 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  on */.  int iLoo
22da0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
22db0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22dc0 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73  r over the terms
22dd0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
22de0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20    int ii, jj;   
22df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22e00 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
22e10 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20    int mxI = 0;  
22e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22e30 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74  ndex of next ent
22e40 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f  ry to replace */
22e50 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e70 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
22e80 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
22e90 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
22ea0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
22eb0 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
22ec0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
22ed0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55   */.  LogEst mxU
22ee0 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20  nsorted = 0;    
22ef0 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72  /* Maximum unsor
22f00 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65  ted cost of a se
22f10 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69  t of path */.  i
22f20 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20  nt nTo, nFrom;  
22f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22f40 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72  er of valid entr
22f50 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64  ies in aTo[] and
22f60 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68   aFrom[] */.  Wh
22f70 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20  erePath *aFrom; 
22f80 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e          /* All n
22f90 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68  From paths at th
22fa0 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c  e previous level
22fb0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
22fc0 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *aTo;           
22fd0 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20  /* The nTo best 
22fe0 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72  paths at the cur
22ff0 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rent level */.  
23000 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d  WherePath *pFrom
23010 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
23020 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d  element of aFrom
23030 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
23040 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
23050 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20  herePath *pTo;  
23060 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
23070 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20  lement of aTo[] 
23080 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
23090 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
230a0 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20  eLoop *pWLoop;  
230b0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
230c0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
230d0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65  jects */.  Where
230e0 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20  Loop **pX;      
230f0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
23100 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61  divy up the pSpa
23110 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c  ce memory */.  L
23120 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74  ogEst *aSortCost
23130 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74   = 0;    /* Sort
23140 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20  ing and partial 
23150 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f  sorting costs */
23160 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23180 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
23190 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
231a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  utine */.  int n
231b0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
231c0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
231d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
231e0 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20   at pSpace */.. 
231f0 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
23200 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
23210 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
23220 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
23230 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
23240 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
23250 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
23260 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
23270 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
23280 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
23290 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
232a0 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
232b0 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
232c0 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
232d0 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
232e0 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
232f0 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d  hoice = (nLoop<=
23300 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
23310 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
23320 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
23330 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
23340 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
23350 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
23360 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
23370 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c  .  (nRowEst=%d)\
23380 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a  n", nRowEst));..
23390 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20    /* If nRowEst 
233a0 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72  is zero and ther
233b0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
233c0 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20   clause, ignore 
233d0 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a  it. In this.  **
233e0 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73   case the purpos
233f0 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e of this call i
23400 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  s to estimate th
23410 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
23420 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62   returned.  ** b
23430 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  y the overall qu
23440 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65  ery. Once this e
23450 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e  stimate has been
23460 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63   obtained, the c
23470 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20  aller.  ** will 
23480 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63  invoke this func
23490 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69  tion a second ti
234a0 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20  me, passing the 
234b0 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a  estimate as the.
234c0 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72    ** nRowEst par
234d0 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66  ameter.  */.  if
234e0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
234f0 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
23500 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65  ==0 ){.    nOrde
23510 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
23520 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
23530 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
23540 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20  y->nExpr;.  }.. 
23550 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
23560 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63   initialize spac
23570 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d  e for aTo, aFrom
23580 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d   and aSortCost[]
23590 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28   */.  nSpace = (
235a0 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68  sizeof(WherePath
235b0 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  )+sizeof(WhereLo
235c0 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68  op*)*nLoop)*mxCh
235d0 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65  oice*2;.  nSpace
235e0 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
235f0 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  t) * nOrderBy;. 
23600 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
23610 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
23620 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66  b, nSpace);.  if
23630 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
23640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23650 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20  M_BKPT;.  aTo = 
23660 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61  (WherePath*)pSpa
23670 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54  ce;.  aFrom = aT
23680 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65  o+mxChoice;.  me
23690 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73  mset(aFrom, 0, s
236a0 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29  izeof(aFrom[0]))
236b0 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c  ;.  pX = (WhereL
236c0 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43  oop**)(aFrom+mxC
236d0 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69  hoice);.  for(ii
236e0 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72  =mxChoice*2, pFr
236f0 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69  om=aTo; ii>0; ii
23700 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20  --, pFrom++, pX 
23710 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70  += nLoop){.    p
23720 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58  From->aLoop = pX
23730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64  ;.  }.  if( nOrd
23740 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
23750 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
23760 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
23770 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  d it is not bein
23780 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75  g ignored, set u
23790 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66  p.    ** space f
237a0 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  or the aSortCost
237b0 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65  [] array. Each e
237c0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53  lement of the aS
237d0 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20  ortCost array.  
237e0 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a    ** is either z
237f0 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74  ero - meaning it
23800 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23810 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20  n initialized - 
23820 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
23830 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52  st of sorting nR
23840 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61  owEst rows of da
23850 74 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72  ta where the fir
23860 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20  st X terms of.  
23870 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
23880 59 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72  Y clause are alr
23890 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77  eady in order, w
238a0 68 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72  here X is the ar
238b0 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65  ray .    ** inde
238c0 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74  x.  */.    aSort
238d0 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29  Cost = (LogEst*)
238e0 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61  pX;.    memset(a
238f0 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a  SortCost, 0, siz
23900 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
23910 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61  rderBy);.  }.  a
23920 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74  ssert( aSortCost
23930 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e  ==0 || &pSpace[n
23940 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26  Space]==(char*)&
23950 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72  aSortCost[nOrder
23960 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  By] );.  assert(
23970 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c   aSortCost!=0 ||
23980 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d   &pSpace[nSpace]
23990 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a  ==(char*)pX );..
239a0 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65    /* Seed the se
239b0 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67  arch with a sing
239c0 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e  le WherePath con
239d0 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65  taining zero Whe
239e0 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20  reLoops..  **.  
239f0 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f  ** TUNING: Do no
23a00 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72  t let the number
23a10 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67   of iterations g
23a20 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20  o above 28.  If 
23a30 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66  the cost.  ** of
23a40 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75   computing an au
23a50 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73  tomatic index is
23a60 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77   not paid back w
23a70 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
23a80 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  28.  ** rows, th
23a90 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  en do not use th
23aa0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
23ab0 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d  x. */.  aFrom[0]
23ac0 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72  .nRow = MIN(pPar
23ad0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20  se->nQueryLoop, 
23ae0 34 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38  48);  assert( 48
23af0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
23b00 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d  28) );.  nFrom =
23b10 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46   1;.  assert( aF
23b20 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
23b30 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  ==0 );.  if( nOr
23b40 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20  derBy ){.    /* 
23b50 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f  If nLoop is zero
23b60 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65  , then there are
23b70 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69   no FROM terms i
23b80 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e  n the query. Sin
23b90 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ce.    ** in thi
23ba0 73 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79  s case the query
23bb0 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61   may return a ma
23bc0 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77  ximum of one row
23bd0 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  , the results.  
23be0 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79    ** are already
23bf0 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
23c00 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f  d order. Set isO
23c10 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72  rdered to nOrder
23c20 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64  By to.    ** ind
23c30 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20  icate this. Or, 
23c40 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61  if nLoop is grea
23c50 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73  ter than zero, s
23c60 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a  et isOrdered to.
23c70 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63      ** -1, indic
23c80 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72  ating that the r
23c90 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72  esult set may or
23ca0 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65   may not be orde
23cb0 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70  red, .    ** dep
23cc0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f  ending on the lo
23cd0 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  ops added to the
23ce0 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20   current plan.  
23cf0 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e  */.    aFrom[0].
23d00 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f  isOrdered = nLoo
23d10 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65  p>0 ? -1 : nOrde
23d20 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  rBy;.  }..  /* C
23d30 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76  ompute successiv
23d40 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65  ely longer Where
23d50 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20  Paths using the 
23d60 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74  previous generat
23d70 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72  ion.  ** of Wher
23d80 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61  ePaths as the ba
23d90 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sis for the next
23da0 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .  Keep track of
23db0 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
23dc0 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74  ** best paths at
23dd0 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e   each generation
23de0 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
23df0 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
23e00 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54  iLoop++){.    nT
23e10 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
23e20 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d  i=0, pFrom=aFrom
23e30 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
23e40 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
23e50 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49    for(pWLoop=pWI
23e60 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c  nfo->pLoops; pWL
23e70 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f  oop; pWLoop=pWLo
23e80 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  op->pNextLoop){.
23e90 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e          LogEst n
23ea0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
23eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
23ec0 73 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46  s visited by (pF
23ed0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
23ee0 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43         LogEst rC
23ef0 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
23f00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
23f10 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b   of path (pFrom+
23f20 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
23f30 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72     LogEst rUnsor
23f40 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
23f50 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64       /* Unsorted
23f60 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b   cost of (pFrom+
23f70 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
23f80 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20     i8 isOrdered 
23f90 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
23fa0 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65  ed;  /* isOrdere
23fb0 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c  d for (pFrom+pWL
23fc0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
23fd0 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b  Bitmask maskNew;
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63    /* Mask of src
24000 20 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29   visited by (..)
24010 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d   */.        Bitm
24020 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24040 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64   Mask of rev-ord
24050 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e  er loops for (..
24060 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66  ) */..        if
24070 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65  ( (pWLoop->prere
24080 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b  q & ~pFrom->mask
24090 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
240a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
240b0 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   (pWLoop->maskSe
240c0 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  lf & pFrom->mask
240d0 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
240e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
240f0 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   (pWLoop->wsFlag
24100 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
24110 4e 44 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f  NDEX)!=0 && pFro
24120 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20  m->nRow<10 ){.  
24130 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
24140 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74  t use an automat
24150 69 63 20 69 6e 64 65 78 20 69 66 20 74 68 65 20  ic index if the 
24160 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70  this loop is exp
24170 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  ected.          
24180 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74  ** to run less t
24190 68 61 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a  han 2 times. */.
241a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
241b0 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
241c0 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  Est(2) );.      
241d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
241e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
241f0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
24200 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61  , pWLoop is a ca
24210 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68  ndidate to be th
24220 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20  e next loop. .  
24230 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65        ** Compute
24240 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20   its cost */.   
24250 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
24260 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
24270 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
24280 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
24290 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
242a0 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
242b0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
242c0 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46  dd(rUnsorted, pF
242d0 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b  rom->rUnsorted);
242e0 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20  .        nOut = 
242f0 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57  pFrom->nRow + pW
24300 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  Loop->nOut;.    
24310 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46      maskNew = pF
24320 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
24330 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
24340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
24350 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20  Ordered<0 ){.   
24360 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
24370 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
24380 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
24390 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nfo,.           
243a0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
243b0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46  fo->pOrderBy, pF
243c0 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74  rom, pWInfo->wct
243d0 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  rlFlags,.       
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243f0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26  iLoop, pWLoop, &
24400 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  revMask);.      
24410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24420 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72     revMask = pFr
24430 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
24440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
24450 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20  f( isOrdered>=0 
24460 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72  && isOrdered<nOr
24470 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
24480 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74     if( aSortCost
24490 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29  [isOrdered]==0 )
244a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53  {.            aS
244b0 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
244c0 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e  d] = whereSortin
244d0 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20  gCost(.         
244e0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e         pWInfo, n
244f0 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79  RowEst, nOrderBy
24500 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20  , isOrdered.    
24510 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
24520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24530 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   rCost = sqlite3
24540 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
24550 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69  ted, aSortCost[i
24560 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20  sOrdered]);..   
24570 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
24580 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20  E(0x002,.       
24590 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f         ("---- so
245a0 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64  rt cost=%-3d (%d
245b0 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63  /%d) increases c
245c0 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c  ost %3d to %-3d\
245d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
245e0 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
245f0 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72  rdered], (nOrder
24600 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e  By-isOrdered), n
24610 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
24620 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74           rUnsort
24630 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20  ed, rCost));.   
24640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24650 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55        rCost = rU
24660 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nsorted;.       
24670 20 20 20 72 55 6e 73 6f 72 74 65 64 20 2d 3d 20     rUnsorted -= 
24680 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20  2;  /* TUNING:  
24690 53 6c 69 67 68 74 20 62 69 61 73 20 69 6e 20 66  Slight bias in f
246a0 61 76 6f 72 20 6f 66 20 6e 6f 2d 73 6f 72 74 20  avor of no-sort 
246b0 70 6c 61 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  plans */.       
246c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
246d0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
246e0 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20  WLoop should be 
246f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
24700 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d   of.        ** m
24710 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d  xChoice best-so-
24720 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20  far paths..     
24730 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
24740 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20   First look for 
24750 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  an existing path
24760 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66   among best-so-f
24770 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20  ar paths.       
24780 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20   ** that covers 
24790 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
247a0 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
247b0 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64  e same isOrdered
247c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74  .        ** sett
247d0 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65  ing as the curre
247e0 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74  nt path candidat
247f0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
24800 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72        ** The ter
24810 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  m "((pTo->isOrde
24820 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
24830 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69  x80)==0" is equi
24840 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  valent.        *
24850 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  * to (pTo->isOrd
24860 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73  ered==(-1))==(is
24870 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20  Ordered==(-1))" 
24880 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20  for the range.  
24890 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61        ** of lega
248a0 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f  l values for isO
248b0 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a  rdered, -1..64..
248c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
248d0 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f     for(jj=0, pTo
248e0 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a  =aTo; jj<nTo; jj
248f0 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
24900 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d        if( pTo->m
24910 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77  askLoop==maskNew
24920 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
24930 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e  (pTo->isOrdered^
24940 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29  isOrdered)&0x80)
24950 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ==0.          ){
24960 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
24970 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31  tcase( jj==nTo-1
24980 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24990 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
249a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
249b0 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f       if( jj>=nTo
249c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
249d0 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69   None of the exi
249e0 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  sting best-so-fa
249f0 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68  r paths match th
24a00 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
24a10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
24a20 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  o>=mxChoice.    
24a30 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74         && (rCost
24a40 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73  >mxCost || (rCos
24a50 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e  t==mxCost && rUn
24a60 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74  sorted>=mxUnsort
24a70 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  ed)).          )
24a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
24a90 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e   The current can
24aa0 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74  didate is no bet
24ab0 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20  ter than any of 
24ac0 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20  the mxChoice.   
24ad0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68           ** path
24ae0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
24af0 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62  he best-so-far b
24b00 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61  uffer.  So disca
24b10 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  rd.            *
24b20 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65  * this candidate
24b30 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20   as not viable. 
24b40 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
24b50 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
24b60 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
24b70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
24b80 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
24ba0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24bb0 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74  ("Skip   %s cost
24bc0 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72  =%-3d,%3d,%3d or
24bd0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24bf0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
24c00 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
24c10 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72  , rCost, nOut, r
24c20 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20  Unsorted,.      
24c30 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
24c40 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
24c50 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
24c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
24c70 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
24c80 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24ca0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
24cb0 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
24cc0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
24cd0 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
24ce0 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
24cf0 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
24d00 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
24d10 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
24d20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
24d30 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
24d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
24d50 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
24d60 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
24d70 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
24d80 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
24d90 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
24da0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24db0 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
24dc0 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
24dd0 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
24de0 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
24df0 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
24e00 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
24e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24e20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
24e30 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
24e40 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
24e50 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
24e60 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
24e70 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
24e80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24e90 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
24ea0 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
24eb0 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
24ec0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
24ed0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
24ee0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
24ef0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
24f00 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74  t, nOut, rUnsort
24f10 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
24f20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
24f30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
24f40 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
24f50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24f60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24f70 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
24f80 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
24f90 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
24fa0 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76   pTo=aTo[jj] cov
24fb0 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ers the.        
24fc0 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66    ** same set of
24fd0 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
24fe0 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65  he same isOrdere
24ff0 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
25000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
25010 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
25020 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
25030 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
25040 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
25050 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
25060 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
25070 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
25080 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ed..          **
25090 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54   .          ** T
250a0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 69  he conditional i
250b0 73 20 61 6e 20 65 78 70 61 6e 64 65 64 20 76 65  s an expanded ve
250c0 63 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ctor comparison 
250d0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
250e0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 70           **   (p
250f0 54 6f 2d 3e 72 43 6f 73 74 2c 70 54 6f 2d 3e 6e  To->rCost,pTo->n
25100 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e 73 6f 72 74  Row,pTo->rUnsort
25110 65 64 29 20 3c 3d 20 28 72 43 6f 73 74 2c 6e 4f  ed) <= (rCost,nO
25120 75 74 2c 72 55 6e 73 6f 72 74 65 64 29 0a 20 20  ut,rUnsorted).  
25130 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25140 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
25150 6f 73 74 3c 72 43 6f 73 74 20 0a 20 20 20 20 20  ost<rCost .     
25160 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72        || (pTo->r
25170 43 6f 73 74 3d 3d 72 43 6f 73 74 0a 20 20 20 20  Cost==rCost.    
25180 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
25190 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75 74 0a 20 20  To->nRow<nOut.  
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52 6f 77 3d 3d   || (pTo->nRow==
251c0 6e 4f 75 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  nOut && pTo->rUn
251d0 73 6f 72 74 65 64 3c 3d 72 55 6e 73 6f 72 74 65  sorted<=rUnsorte
251e0 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d).             
251f0 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
25200 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
25210 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
25220 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
25230 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
25240 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25250 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
25260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
25270 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25280 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
25290 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
252a0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
252b0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
252d0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
252e0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
252f0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
25300 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20   rUnsorted,.    
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25320 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
25330 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
25340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
25350 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25360 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f  ntf("   vs %s co
25370 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20  st=%-3d,%3d,%3d 
25380 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
253a0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
253b0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
253c0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
253d0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
253e0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e          pTo->rUn
253f0 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f  sorted, pTo->isO
25400 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d  rdered>=0 ? pTo-
25410 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a  >isOrdered+'0' :
25420 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
25430 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25440 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61          /* Disca
25450 72 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  rd the candidate
25460 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68   path from furth
25470 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
25480 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25490 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
254a0 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20  Cost==rCost );. 
254b0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
254c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
254d0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
254e0 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
254f0 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20  =rCost+1 );.    
25500 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
25510 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
25520 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
25530 61 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68  ath is better th
25540 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  an the.         
25550 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52   ** pTo path.  R
25560 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20  eplace pTo with 
25570 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a  the candidate. *
25580 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
25590 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
255a0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
255b0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
255c0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
255d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
255e0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
25600 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
25610 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  d,%3d,%3d order=
25620 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
25630 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
25640 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
25650 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
25660 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64   nOut, rUnsorted
25670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25680 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
25690 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
256a0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
256b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
256c0 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
256d0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33  cost=%-3d,%3d,%3
256e0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25700 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
25710 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
25720 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
25730 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
25740 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f        pTo->rUnso
25750 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73 4f 72 64  rted, pTo->isOrd
25760 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
25770 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
25780 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
25790 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
257a0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
257b0 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
257c0 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
257d0 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
257e0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
257f0 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
25800 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
25810 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
25820 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
25830 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
25840 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
25850 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
25860 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
25870 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
25880 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d  pTo->rUnsorted =
25890 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
258a0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
258b0 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
258c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
258d0 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
258e0 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
258f0 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
25900 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
25910 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
25920 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
25930 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
25940 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
25950 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
25960 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
25970 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
25980 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
25990 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
259a0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
259b0 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
259c0 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
259d0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
259e0 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
259f0 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20  ost>mxCost .    
25a00 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
25a10 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
25a20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
25a30 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20  d>mxUnsorted) . 
25a40 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
25a50 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
25a60 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
25a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
25a80 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d  xUnsorted = pTo-
25a90 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20  >rUnsorted;.    
25aa0 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
25ab0 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
25ac0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
25ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25ae0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
25af0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25b00 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
25b10 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25b20 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a  Trace & 0x02 ){.
25b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25b40 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
25b50 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
25b60 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
25b70 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
25b80 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
25b90 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
25ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25bb0 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
25bc0 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
25bd0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
25be0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
25bf0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
25c00 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
25c10 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
25c20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
25c30 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70  sOrdered>=0 ? (p
25c40 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
25c50 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
25c60 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
25c70 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  dered>0 ){.     
25c80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25c90 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
25ca0 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
25cb0 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
25cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25cd0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25ce0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
25cf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25d00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
25d10 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
25d20 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
25d30 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
25d40 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
25d50 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
25d60 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
25d70 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
25d80 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
25d90 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
25da0 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
25db0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25dc0 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
25dd0 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
25de0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
25df0 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
25e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25e10 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
25e20 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
25e30 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
25e40 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
25e50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
25e60 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
25e70 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
25e80 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
25e90 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
25ea0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
25eb0 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
25ec0 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
25ed0 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
25ee0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
25ef0 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
25f00 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
25f10 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
25f20 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
25f30 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
25f40 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
25f50 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
25f60 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
25f70 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
25f80 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
25f90 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
25fa0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
25fb0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
25fc0 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
25fd0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
25fe0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
25ff0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
26000 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
26010 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
26020 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
26030 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
26040 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
26050 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
26060 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
26070 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
26080 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
26090 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
260a0 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
260b0 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
260c0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
260d0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
260e0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
260f0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
26100 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
26110 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
26120 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
26130 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
26140 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
26150 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
26160 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
26170 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  c==pWInfo->pResu
26180 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  ltSet->nExpr ){.
26190 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
261a0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
261b0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
261c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
261d0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
261e0 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57  By ){.    if( pW
261f0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
26200 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
26210 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28  TBY ){.      if(
26220 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
26230 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  d==pWInfo->pOrde
26240 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
26250 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
26260 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
26270 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
26280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
26290 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  lse{.      pWInf
262a0 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f  o->nOBSat = pFro
262b0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  m->isOrdered;.  
262c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
262d0 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
262e0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  Loop;.      if( 
262f0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d  pWInfo->nOBSat<=
26300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  0 ){.        pWI
26310 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
26320 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f  .        if( nLo
26330 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  op>0 ){.        
26340 20 20 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20    u32 wsFlags = 
26350 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
26360 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a  op-1]->wsFlags;.
26370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
26380 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
26390 4e 45 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20  NEROW)==0 .     
263a0 20 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67        && (wsFlag
263b0 73 26 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  s&(WHERE_IPK|WHE
263c0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d  RE_COLUMN_IN))!=
263d0 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
263e0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20  _COLUMN_IN).    
263f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26400 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
26410 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
26420 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
26430 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
26440 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
26450 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
26460 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
26470 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
26480 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e  ORDERBY_LIMIT, n
26490 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
264a0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
264b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
264c0 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
264d0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b  s & WHERE_IPK );
264e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
264f0 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
26500 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
26510 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
26520 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
26530 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
26540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26550 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65   pWInfo->bOrdere
26560 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a  dInnerLoop = 1;.
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
26580 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
26590 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  m;.            }
265a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
265b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
265c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57     }.    if( (pW
265d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
265e0 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
265f0 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26  ROUP).        &&
26600 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d   pWInfo->nOBSat=
26610 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
26620 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f  y->nExpr && nLoo
26630 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  p>0.    ){.     
26640 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
26650 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
26660 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61  nOrder = wherePa
26670 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
26680 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
26690 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20  o->pOrderBy, .  
266a0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30          pFrom, 0
266b0 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
266c0 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
266d0 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20  , &revMask.     
266e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
266f0 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  ( pWInfo->sorted
26700 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
26710 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d   nOrder==pWInfo-
26720 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
26730 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
26740 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a  fo->sorted = 1;.
26750 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
26760 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73  revMask = revMas
26770 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26780 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d  .  }...  pWInfo-
26790 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
267a0 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
267b0 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
267c0 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
267d0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
267e0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
267f0 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
26800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26810 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
26820 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
26830 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
26840 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
26850 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
26860 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
26870 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
26880 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
26890 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
268a0 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
268b0 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
268c0 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
268d0 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
268e0 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
268f0 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
26900 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
26910 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
26920 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
26930 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
26940 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
26950 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
26960 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
26970 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
26980 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
26990 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
269a0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
269b0 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
269c0 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
269d0 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
269e0 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
269f0 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
26a00 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
26a10 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
26a20 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
26a30 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
26a40 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
26a50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
26a60 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
26a70 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
26a80 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
26a90 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
26aa0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
26ab0 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
26ac0 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
26ad0 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
26ae0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
26af0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
26b00 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26b10 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20  _OR_SUBCLAUSE ) 
26b20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
26b30 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
26b40 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
26b50 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
26b60 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
26b70 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
26b80 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
26b90 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
26ba0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
26bb0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
26bc0 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dBy ) return 0;.
26bd0 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
26be0 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
26bf0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
26c00 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
26c10 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
26c20 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
26c30 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20   pLoop->nSkip = 
26c40 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  0;.  pTerm = sql
26c50 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
26c60 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
26c70 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c   0, WO_EQ|WO_IS,
26c80 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
26c90 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
26ca0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
26cb0 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
26cc0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
26cd0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
26ce0 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
26cf0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
26d00 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
26d10 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
26d20 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
26d30 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
26d40 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
26d50 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
26d60 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
26d70 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
26d80 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
26d90 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33    /* 33==sqlite3
26da0 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20  LogEst(10) */.  
26db0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
26dc0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
26dd0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
26de0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
26df0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20   int opMask;.   
26e00 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
26e10 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70  ->aLTermSpace==p
26e20 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a  Loop->aLTerm );.
26e30 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69        if( !IsUni
26e40 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20  queIndex(pIdx). 
26e50 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
26e60 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
26e70 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
26e80 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
26e90 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
26ea0 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
26eb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26ec0 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75  opMask = pIdx->u
26ed0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f  niqNotNull ? (WO
26ee0 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f  _EQ|WO_IS) : WO_
26ef0 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  EQ;.      for(j=
26f00 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
26f10 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
26f20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
26f30 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
26f40 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20  WC, iCur, j, 0, 
26f50 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  opMask, pIdx);. 
26f60 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
26f70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26f80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26f90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
26fa0 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
26fb0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
26fc0 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
26fd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
26fe0 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  !=pIdx->nKeyCol 
26ff0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27000 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
27010 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
27020 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
27030 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
27040 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69       if( pIdx->i
27050 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49  sCovering || (pI
27060 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
27070 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
27080 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
27090 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
270a0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
270b0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
270c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
270d0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
270e0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
270f0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
27100 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
27110 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
27120 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
27130 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
27140 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
27150 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
27160 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
27170 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
27180 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
27190 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
271a0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
271b0 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
271c0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31  nOut = (LogEst)1
271d0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
271e0 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
271f0 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  p;.    assert( p
27200 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e  WInfo->sMaskSet.
27210 6e 3d 3d 31 20 26 26 20 69 43 75 72 3d 3d 70 57  n==1 && iCur==pW
27220 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 69  Info->sMaskSet.i
27230 78 5b 30 5d 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  x[0] );.    pLoo
27240 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 31 3b  p->maskSelf = 1;
27250 20 2f 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   /* sqlite3Where
27260 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
27270 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
27280 3b 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ; */.    pWInfo-
27290 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
272a0 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
272b0 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
272c0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
272d0 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
272e0 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e  ->nOBSat =  pWIn
272f0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
27300 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  xpr;.    if( pWI
27310 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27320 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
27330 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
27340 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
27350 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
27360 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
27370 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
27380 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
27390 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
273a0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
273b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
273c0 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
273d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 78 70 72  unction for expr
273e0 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28  IsDeterministic(
273f0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
27400 20 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72   exprNodeIsDeter
27410 6d 69 6e 69 73 74 69 63 28 57 61 6c 6b 65 72 20  ministic(Walker 
27420 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
27430 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
27440 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
27450 54 49 4f 4e 20 26 26 20 45 78 70 72 48 61 73 50  TION && ExprHasP
27460 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
27470 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3d 3d 30 20  P_ConstFunc)==0 
27480 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
27490 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
274a0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
274b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
274c0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
274d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
274e0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
274f0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6e  on contains no n
27500 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
27510 20 53 51 4c 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   SQL .** functio
27520 6e 73 2e 20 44 6f 20 6e 6f 74 20 63 6f 6e 73 69  ns. Do not consi
27530 64 65 72 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  der non-determin
27540 69 73 74 69 63 20 53 51 4c 20 66 75 6e 63 74 69  istic SQL functi
27550 6f 6e 73 20 74 68 61 74 20 61 72 65 20 0a 2a 2a  ons that are .**
27560 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
27570 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ect statements..
27580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
27590 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  prIsDeterministi
275a0 63 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  c(Expr *p){.  Wa
275b0 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
275c0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
275d0 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
275e0 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
275f0 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
27600 73 44 65 74 65 72 6d 69 6e 69 73 74 69 63 3b 0a  sDeterministic;.
27610 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
27620 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
27630 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 20 20 73  ectWalkFail;.  s
27640 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
27650 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
27660 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  w.eCode;.}../*.*
27670 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
27680 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
27690 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
276a0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
276b0 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
276c0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
276d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
276e0 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
276f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
27700 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
27710 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
27720 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
27730 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
27740 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
27750 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
27760 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
27770 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
27780 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
27790 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
277a0 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
277b0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
277c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
277d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
277e0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
277f0 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
27800 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
27810 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
27820 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
27830 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
27840 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
27850 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
27860 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
27870 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
27880 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
27890 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
278a0 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
278b0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
278c0 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
278d0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
278e0 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
278f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
27900 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
27910 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
27920 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
27930 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
27940 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
27950 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
27960 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
27970 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
27980 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
27990 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
279a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
279b0 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
279c0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
279d0 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
279e0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
279f0 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
27a00 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
27a10 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
27a20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
27a30 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
27a40 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
27a50 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a70 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
27a80 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
27a90 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ab0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
27ac0 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
27ad0 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
27ae0 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
27af0 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
27b00 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
27b10 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
27b20 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
27b30 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
27b40 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
27b50 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
27b60 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
27b70 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
27b80 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
27b90 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
27ba0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
27bb0 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
27bc0 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
27bd0 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
27be0 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
27bf0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
27c00 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
27c10 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
27c20 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
27c30 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
27c40 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
27c50 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
27c60 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
27c70 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
27c80 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
27c90 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
27ca0 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
27cb0 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
27cc0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
27cd0 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
27ce0 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
27cf0 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
27d00 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
27d10 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
27d20 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
27d30 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
27d40 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
27d50 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
27d60 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
27d70 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
27d80 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
27d90 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
27da0 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
27db0 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
27dc0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
27dd0 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
27de0 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
27df0 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
27e00 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
27e10 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
27e20 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
27e30 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
27e40 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
27e50 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
27e60 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
27e70 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
27e80 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
27e90 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
27ea0 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
27eb0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
27ec0 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
27ed0 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
27ee0 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
27ef0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27f00 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
27f10 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
27f20 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
27f30 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
27f40 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
27f50 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
27f60 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
27f70 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
27f80 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
27f90 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
27fa0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
27fb0 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
27fc0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
27fd0 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
27fe0 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
27ff0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
28000 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
28010 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
28020 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
28030 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
28040 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
28050 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
28060 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
28070 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
28080 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
28090 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
280a0 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
280b0 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
280c0 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
280d0 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
280e0 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
280f0 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
28100 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
28110 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
28120 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
28130 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
28140 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
28150 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
28160 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
28170 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
28180 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
28190 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
281a0 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
281b0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
281c0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
281d0 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
281e0 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
281f0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
28200 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
28210 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
28220 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
28230 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
28240 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
28250 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
28260 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
28270 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
28280 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
28290 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
282a0 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
282b0 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
282c0 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
282d0 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
282e0 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
282f0 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
28300 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20  R BY clause (or 
28310 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
28320 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  use.** if the WH
28330 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
28340 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c   is set in wctrl
28350 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45  Flags) of a SELE
28360 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
28370 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
28380 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
28390 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
283a0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
283b0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
283c0 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
283d0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
283e0 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
283f0 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
28400 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61  * The iIdxCur pa
28410 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63  rameter is the c
28420 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
28430 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a  an index.  If .*
28440 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
28450 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49 64  AUSE is set, iId
28460 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
28470 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
28480 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
28490 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
284a0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
284b0 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
284c0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
284d0 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
284e0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
284f0 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
28500 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
28510 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
28520 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
28530 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
28540 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
28550 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
28560 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
28570 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
28580 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
28590 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
285a0 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
285b0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
285c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
285d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
285e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
285f0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
28600 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
28610 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  TabList,      /*
28620 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
28630 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
28640 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
28650 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
28660 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  re,           /*
28670 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
28680 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
28690 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
286a0 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
286b0 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
286c0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
286d0 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75   ExprList *pResu
286e0 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51 75 65 72  ltSet,   /* Quer
286f0 79 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 52  y result set.  R
28700 65 71 27 64 20 66 6f 72 20 44 49 53 54 49 4e 43  eq'd for DISTINC
28710 54 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  T */.  u16 wctrl
28720 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
28730 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  * The WHERE_* fl
28740 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
28750 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
28760 69 6e 74 20 69 41 75 78 41 72 67 20 20 20 20 20  int iAuxArg     
28770 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
28780 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
28790 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63   is set, index c
287a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45         ** If WHE
287d0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68  RE_USE_LIMIT, th
287e0 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f  en the limit amo
287f0 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  unt */.){.  int 
28800 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
28810 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
28820 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
28830 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
28840 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
28850 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
28860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28870 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
28880 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
28890 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
288a0 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
288b0 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
288c0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
288d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
288e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
288f0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
28900 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
28910 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
28920 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
28930 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
28940 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
28950 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
28960 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
28970 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
28980 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
28990 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
289a0 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
289b0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
289c0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
289d0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
289e0 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
289f0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
28a00 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
28a10 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
28a20 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
28a30 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
28a40 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
28a50 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
28a60 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
28a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
28a80 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
28a90 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
28ab0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
28ac0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28af0 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65  */.  u8 bFordele
28b00 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
28b10 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  /* OPFLAG_FORDEL
28b20 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20  ETE or zero, as 
28b30 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a  appropriate */..
28b40 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
28b50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
28b60 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d  EPASS_MULTIROW)=
28b70 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20  =0 || (.        
28b80 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28b90 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
28ba0 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26  RED)!=0 .     &&
28bb0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
28bc0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
28bd0 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20  E)==0 .  ));..  
28be0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57  /* Only one of W
28bf0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
28c00 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45 5f 4c  E or WHERE_USE_L
28c10 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65 72 74  IMIT */.  assert
28c20 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
28c30 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28c40 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  SE)==0.         
28c50 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
28c60 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  s & WHERE_USE_LI
28c70 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  MIT)==0 );..  /*
28c80 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
28c90 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62  lization */.  db
28ca0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
28cb0 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30   memset(&sWLB, 0
28cc0 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b  , sizeof(sWLB));
28cd0 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f  ..  /* An ORDER/
28ce0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
28cf0 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20  of more than 63 
28d00 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20  terms cannot be 
28d10 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74  optimized */.  t
28d20 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72 42  estcase( pOrderB
28d30 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e  y && pOrderBy->n
28d40 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  Expr==BMS-1 );. 
28d50 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
28d60 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
28d70 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79  >=BMS ) pOrderBy
28d80 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72   = 0;.  sWLB.pOr
28d90 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
28da0 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  ;..  /* Disable 
28db0 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74  the DISTINCT opt
28dc0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c  imization if SQL
28dd0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
28de0 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20  is set via.  ** 
28df0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72  sqlite3_test_ctr
28e00 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
28e10 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
28e20 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ...) */.  if( Op
28e30 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
28e40 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69  ed(db, SQLITE_Di
28e50 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20  stinctOpt) ){.  
28e60 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20    wctrlFlags &= 
28e70 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54  ~WHERE_WANT_DIST
28e80 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  INCT;.  }..  /* 
28e90 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
28ea0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
28eb0 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
28ec0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
28ed0 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
28ee0 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
28ef0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
28f00 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
28f10 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
28f20 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
28f30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28f40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
28f50 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
28f60 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
28f70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
28f80 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
28f90 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
28fa0 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
28fb0 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
28fc0 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
28fd0 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
28fe0 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52 5f 53  f the WHERE_OR_S
28ff0 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73  UBCLAUSE flag is
29000 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68   set, then we sh
29010 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67  ould.  ** only g
29020 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
29030 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
29040 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64   in pTabList and
29050 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a   assume that.  *
29060 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73  * any cursors as
29070 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75  sociated with su
29080 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20  bsequent tables 
29090 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  are uninitialize
290a0 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69  d..  */.  nTabLi
290b0 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73  st = (wctrlFlags
290c0 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
290d0 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70 54 61  LAUSE) ? 1 : pTa
290e0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
290f0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
29100 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
29110 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
29120 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
29130 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
29140 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
29150 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
29160 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
29170 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
29180 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
29190 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
291a0 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
291b0 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
291c0 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
291d0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
291e0 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
291f0 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
29200 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
29210 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
29220 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
29230 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
29240 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
29250 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
29260 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
29270 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
29280 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
29290 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
292a0 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
292b0 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
292c0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
292d0 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
292e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
292f0 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 57  RawNN(db, nByteW
29300 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68  Info + sizeof(Wh
29310 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28  ereLoop));.  if(
29320 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29330 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
29340 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
29350 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
29360 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
29370 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
29380 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  }.  pWInfo->pPar
29390 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
293a0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
293b0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
293c0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
293d0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
293e0 6e 66 6f 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  nfo->pWhere = pW
293f0 68 65 72 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  here;.  pWInfo->
29400 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52 65  pResultSet = pRe
29410 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e 66  sultSet;.  pWInf
29420 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
29430 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43  0] = pWInfo->aiC
29440 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d  urOnePass[1] = -
29450 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  1;.  pWInfo->nLe
29460 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
29470 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
29480 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74   = pWInfo->iCont
29490 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
294a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
294b0 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
294c0 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
294d0 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  s;.  pWInfo->iLi
294e0 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  mit = iAuxArg;. 
294f0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
29500 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
29510 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
29520 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d   memset(&pWInfo-
29530 3e 6e 4f 42 53 61 74 2c 20 30 2c 20 0a 20 20 20  >nOBSat, 0, .   
29540 20 20 20 20 20 20 6f 66 66 73 65 74 6f 66 28 57        offsetof(W
29550 68 65 72 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20  hereInfo,sWC) - 
29560 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e  offsetof(WhereIn
29570 66 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d  fo,nOBSat));.  m
29580 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61  emset(&pWInfo->a
29590 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  [0], 0, sizeof(W
295a0 68 65 72 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69  hereLoop)+nTabLi
295b0 73 74 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  st*sizeof(WhereL
295c0 65 76 65 6c 29 29 3b 0a 20 20 61 73 73 65 72 74  evel));.  assert
295d0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
295e0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
295f0 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64  );  /* ONEPASS d
29600 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a  efaults to OFF *
29610 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  /.  pMaskSet = &
29620 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
29630 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
29640 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
29650 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
29660 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
29670 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
29680 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
29690 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
296a0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
296b0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
296c0 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
296d0 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
296e0 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
296f0 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
29700 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
29710 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
29720 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
29730 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
29740 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
29750 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
29760 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
29770 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
29780 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
29790 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
297a0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
297b0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
297c0 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f  auseInit(&pWInfo
297d0 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a  ->sWC, pWInfo);.
297e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70    sqlite3WhereSp
297f0 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  lit(&pWInfo->sWC
29800 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
29810 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
29820 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
29830 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
29840 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
29850 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
29860 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
29870 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
29880 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
29890 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
298a0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
298b0 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
298c0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
298d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
298e0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  IQUE;.    }.  }e
298f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 73 73 69  lse{.    /* Assi
29900 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
29910 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
29920 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
29930 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  ROM clause..    
29940 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 4e 2d  **.    ** The N-
29950 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  th term of the F
29960 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73  ROM clause is as
29970 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b  signed a bitmask
29980 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20 20 2a 2a   of 1<<N..    **
29990 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6c 65  .    ** The rule
299a0 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
299b0 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65   sentence ensure
299c0 73 20 74 68 74 61 20 69 66 20 58 20 69 73 20 74  s thta if X is t
299d0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20  he bitmask for. 
299e0 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c     ** a table T,
299f0 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65   then X-1 is the
29a00 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
29a10 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
29a20 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a   the left of T..
29a30 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74      ** Knowing t
29a40 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
29a50 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
29a60 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
29a70 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a 2a 20 69  join is.    ** i
29a80 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
29a90 74 20 23 33 30 31 35 2e 0a 20 20 20 20 2a 2a 0a  t #3015..    **.
29aa0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
29ab0 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72   bitmasks are cr
29ac0 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54  eated for all pT
29ad0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62  abList->nSrc tab
29ae0 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 70 54  les in.    ** pT
29af0 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74  abList, not just
29b00 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c   the first nTabL
29b10 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61  ist tables.  nTa
29b20 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c  bList is normall
29b30 79 0a 20 20 20 20 2a 2a 20 65 71 75 61 6c 20 74  y.    ** equal t
29b40 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
29b50 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
29b60 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
29b70 74 68 65 0a 20 20 20 20 2a 2a 20 57 48 45 52 45  the.    ** WHERE
29b80 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c  _OR_SUBCLAUSE fl
29b90 61 67 20 69 73 20 73 65 74 2e 0a 20 20 20 20 2a  ag is set..    *
29ba0 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b 0a 20 20  /.    ii = 0;.  
29bb0 20 20 64 6f 7b 0a 20 20 20 20 20 20 63 72 65 61    do{.      crea
29bc0 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
29bd0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
29be0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
29bf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62   sqlite3WhereTab
29c00 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c  FuncArgs(pParse,
29c10 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69   &pTabList->a[ii
29c20 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ], &pWInfo->sWC)
29c30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
29c40 2b 69 69 29 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  +ii)<pTabList->n
29c50 53 72 63 20 29 3b 0a 20 20 23 69 66 64 65 66 20  Src );.  #ifdef 
29c60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
29c70 20 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b   {.      Bitmask
29c80 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66   mx = 0;.      f
29c90 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
29ca0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
29cb0 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
29cc0 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  sk m = sqlite3Wh
29cd0 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b  ereGetMask(pMask
29ce0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
29cf0 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
29d00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
29d10 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20 20 20 20  >=mx );.        
29d20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20 20 7d 0a  mx = m;.      }.
29d30 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20      }.  #endif. 
29d40 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e 61 6c 79   }.  .  /* Analy
29d50 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
29d60 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f  bexpressions. */
29d70 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
29d80 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
29d90 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
29da0 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
29db0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
29dc0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
29dd0 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  r;..  /* Special
29de0 20 63 61 73 65 3a 20 57 48 45 52 45 20 74 65 72   case: WHERE ter
29df0 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72  ms that do not r
29e00 65 66 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c  efer to any tabl
29e10 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20  es in the join. 
29e20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78   ** (constant ex
29e30 70 72 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c  pressions). Eval
29e40 75 61 74 65 20 65 61 63 68 20 73 75 63 68 20 74  uate each such t
29e50 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76  erm, and jump ov
29e60 65 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  er all the.  ** 
29e70 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69  generated code i
29e80 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
29e90 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a  not true.  .  **
29ea0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20  .  ** Do not do 
29eb0 74 68 69 73 20 69 66 20 74 68 65 20 65 78 70 72  this if the expr
29ec0 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
29ed0 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
29ee0 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a  c functions.  **
29ef0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69   that are not wi
29f00 74 68 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63  thin a sub-selec
29f10 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73  t. This is not s
29f20 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
29f30 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65  , but.  ** prese
29f40 72 76 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65  rves SQLite's le
29f50 67 61 63 79 20 62 65 68 61 76 69 6f 75 72 20 69  gacy behaviour i
29f60 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
29f70 74 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a  two cases:.  **.
29f80 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20    **   FROM ... 
29f90 57 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30  WHERE random()>0
29fa0 3b 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65  ;           -- e
29fb0 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63  val random() onc
29fc0 65 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20  e per row.  **  
29fd0 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20   FROM ... WHERE 
29fe0 28 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29  (SELECT random()
29ff0 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61  )>0;  -- eval ra
2a000 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72  ndom() once over
2a010 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  all.  */.  for(i
2a020 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43  i=0; ii<sWLB.pWC
2a030 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
2a040 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2a050 54 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61  T = &sWLB.pWC->a
2a060 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54  [ii];.    if( pT
2a070 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26  ->prereqAll==0 &
2a080 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c  & (nTabList==0 |
2a090 7c 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e  | exprIsDetermin
2a0a0 69 73 74 69 63 28 70 54 2d 3e 70 45 78 70 72 29  istic(pT->pExpr)
2a0b0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2a0c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
2a0d0 61 72 73 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c  arse, pT->pExpr,
2a0e0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
2a0f0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2a100 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77  LL);.      pT->w
2a110 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
2a120 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
2a130 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
2a140 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2a150 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69  ISTINCT ){.    i
2a160 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
2a170 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
2a180 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f  TabList, &pWInfo
2a190 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65  ->sWC, pResultSe
2a1a0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
2a1b0 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b  he DISTINCT mark
2a1c0 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  ing is pointless
2a1d0 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f  .  Ignore it. */
2a1e0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2a1f0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
2a200 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2a210 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a220 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2a230 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f       /* Try to O
2a240 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75  RDER BY the resu
2a250 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64  lt set to make d
2a260 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69  istinct processi
2a270 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20  ng easier */.   
2a280 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c     pWInfo->wctrl
2a290 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44  Flags |= WHERE_D
2a2a0 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20  ISTINCTBY;.     
2a2b0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
2a2c0 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a  y = pResultSet;.
2a2d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a2e0 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
2a2f0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2a300 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  */.#if defined(W
2a310 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2a320 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  D).  if( sqlite3
2a330 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 66  WhereTrace & 0xf
2a340 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fff ){.    sqlit
2a350 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a  e3DebugPrintf("*
2a360 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
2a370 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61  rt *** (wctrlFla
2a380 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46  gs: 0x%x",wctrlF
2a390 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77  lags);.    if( w
2a3a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a3b0 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_USE_LIMIT ){. 
2a3c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2a3d0 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74  gPrintf(", limit
2a3e0 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b  : %d", iAuxArg);
2a3f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a400 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
2a410 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
2a420 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
2a430 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20  e & 0x100 ){ /* 
2a440 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
2a450 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2a460 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  lause */.    sql
2a470 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50  ite3WhereClauseP
2a480 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a  rint(sWLB.pWC);.
2a490 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2a4a0 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c  ( nTabList!=1 ||
2a4b0 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26   whereShortCut(&
2a4c0 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sWLB)==0 ){.    
2a4d0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
2a4e0 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20  dAll(&sWLB);.   
2a4f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
2a500 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2a510 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54    .#ifdef WHERET
2a520 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2a530 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2a540 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20  eTrace ){    /* 
2a550 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
2a560 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
2a570 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68  ects */.      Wh
2a580 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
2a590 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
2a5a0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2a5b0 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
2a5c0 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
2a5d0 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
2a5e0 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
2a620 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
2a630 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
2a640 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
2a650 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
2a660 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
2a670 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
2a680 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  i%(sizeof(zLabel
2a690 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  )-1)];.        w
2a6a0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
2a6b0 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
2a6c0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
2a6d0 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
2a6e0 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2a6f0 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
2a700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2a710 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2a720 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
2a730 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
2a740 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
2a750 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2a760 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
2a770 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
2a780 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a790 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2a7a0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
2a7b0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
2a7c0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
2a7d0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2a7e0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
2a7f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
2a800 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c  fo->revMask = AL
2a810 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28  LBITS;.  }.  if(
2a820 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2a830 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
2a840 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20  cFailed) ){.    
2a850 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2a860 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rror;.  }.#ifdef
2a870 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2a880 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2a890 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
2a8a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2a8b0 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75  rintf("---- Solu
2a8c0 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70  tion nRow=%d", p
2a8d0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
2a8e0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2a8f0 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20  >nOBSat>0 ){.   
2a900 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2a910 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
2a920 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e  %d,0x%llx", pWIn
2a930 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e  fo->nOBSat, pWIn
2a940 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20  fo->revMask);.  
2a950 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
2a960 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2a970 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
2a980 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2a990 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
2a9a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2a9b0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2a9c0 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20  unique");.      
2a9d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a9e0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
2a9f0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
2aa00 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2aa10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2aa20 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64  ("  DISTINCT=ord
2aa30 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
2aa40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2aa50 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
2aa60 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2aa70 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2aa80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2aa90 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f  ("  DISTINCT=uno
2aaa0 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
2aab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2aac0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2aad0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
2aae0 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  n");.    for(ii=
2aaf0 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  0; ii<pWInfo->nL
2ab00 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  evel; ii++){.   
2ab10 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2ab20 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e  t(pWInfo->a[ii].
2ab30 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43  pWLoop, sWLB.pWC
2ab40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2ab50 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  dif.  /* Attempt
2ab60 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20   to omit tables 
2ab70 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68  from the join th
2ab80 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74  at do not effect
2ab90 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
2aba0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
2abb0 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65  vel>=2.   && pRe
2abc0 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26  sultSet!=0.   &&
2abd0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2abe0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2abf0 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20  OmitNoopJoin).  
2ac00 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74  ){.    Bitmask t
2ac10 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33  abUsed = sqlite3
2ac20 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
2ac30 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65  ge(pMaskSet, pRe
2ac40 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66  sultSet);.    if
2ac50 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20  ( sWLB.pOrderBy 
2ac60 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64  ){.      tabUsed
2ac70 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
2ac80 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
2ac90 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
2aca0 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  derBy);.    }.  
2acb0 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
2acc0 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20  >nLevel>=2 ){.  
2acd0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2ace0 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  Term, *pEnd;.   
2acf0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
2ad00 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  o->a[pWInfo->nLe
2ad10 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  vel-1].pWLoop;. 
2ad20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
2ad30 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2ad40 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f  oop->iTab].fg.jo
2ad50 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
2ad60 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2ad70 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2ad80 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
2ad90 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
2ada0 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
2adb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2adc0 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
2add0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
2ade0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2adf0 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
2ae00 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
2ae10 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
2ae20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
2ae30 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
2ae40 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
2ae50 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
2ae60 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
2ae70 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2ae80 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2ae90 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
2aea0 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
2aeb0 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
2aec0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
2aed0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
2aee0 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
2aef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
2af00 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2af10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2af20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
2af30 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
2af40 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
2af50 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
2af60 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
2af70 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
2af80 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
2af90 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
2afa0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
2afb0 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
2afc0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
2afd0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
2afe0 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
2aff0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2b000 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
2b010 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
2b020 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2b030 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2b040 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2b050 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2b060 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2b070 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2b080 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2b090 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2b0a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2b0b0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2b0c0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2b0d0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2b0e0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2b0f0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2b100 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2b110 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
2b120 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
2b130 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
2b140 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2b150 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
2b160 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
2b170 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
2b180 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77  .    if( bOnerow
2b190 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c  .     || ((wctrl
2b1a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2b1b0 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21  EPASS_MULTIROW)!
2b1c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2b1d0 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57   0==(wsFlags & W
2b1e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b1f0 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  E)).    ){.     
2b200 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2b210 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e  s = bOnerow ? ON
2b220 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f  EPASS_SINGLE : O
2b230 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20  NEPASS_MULTI;.  
2b240 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
2b250 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
2b260 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67  pTab) && (wsFlag
2b270 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2b280 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LY) ){.        i
2b290 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2b2a0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2b2b0 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  LTIROW ){.      
2b2c0 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d      bFordelete =
2b2d0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
2b2e0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
2b2f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
2b300 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2b310 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e  s = (wsFlags & ~
2b320 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b  WHERE_IDX_ONLY);
2b330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b340 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
2b350 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2b360 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
2b370 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
2b380 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
2b390 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
2b3a0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
2b3b0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2b3c0 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
2b3d0 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
2b3e0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2b3f0 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
2b400 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
2b410 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
2b420 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
2b430 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2b440 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
2b450 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2b460 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2b470 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
2b480 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2b490 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2b4a0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
2b4b0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2b4c0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2b4d0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2b4e0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2b4f0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
2b500 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
2b510 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2b520 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2b530 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2b540 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2b550 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2b560 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2b570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2b580 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2b590 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2b5a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2b5b0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
2b5c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b5d0 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
2b5e0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
2b5f0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
2b600 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
2b610 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
2b620 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
2b630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2b640 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
2b650 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
2b660 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
2b670 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
2b680 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
2b690 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
2b6a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2b6b0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2b6c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2b6d0 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
2b6e0 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
2b6f0 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2b700 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20  CLAUSE)==0 ){.  
2b710 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
2b720 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
2b730 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2b740 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
2b750 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  F ){.        op 
2b760 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
2b770 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2b780 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
2b790 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2b7a0 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  sor;.      };.  
2b7b0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
2b7c0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
2b7d0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
2b7e0 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
2b7f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b800 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d  abItem->iCursor=
2b810 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
2b820 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2b830 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2b840 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2b850 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2b860 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2b870 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2b880 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2b890 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2b8a0 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2b8b0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2b8c0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2b8d0 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
2b8e0 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f  Col<BMS && HasRo
2b8f0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2b900 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
2b910 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
2b920 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
2b930 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
2b940 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
2b950 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
2b960 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b970 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45  P4(v, -1, SQLITE
2b980 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
2b990 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
2b9a0 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
2b9b0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
2b9c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2b9d0 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
2b9e0 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  HINTS.      if( 
2b9f0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2ba00 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
2ba10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ba20 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
2ba30 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c  G_SEEKEQ|bFordel
2ba40 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ete);.      }els
2ba50 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
2ba60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ba70 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2ba80 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
2ba90 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2baa0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
2bab0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
2bac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bad0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
2bae0 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74  umnsUsed, pTabIt
2baf0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20  em->iCursor, 0, 
2bb00 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2bb20 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49  const u8*)&pTabI
2bb30 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34  tem->colUsed, P4
2bb40 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
2bb50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb60 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
2bb70 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
2bb80 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
2bb90 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2bba0 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
2bbb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2bbc0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
2bbd0 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
2bbe0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2bbf0 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
2bc00 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
2bc10 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
2bc20 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
2bc30 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61 79  iAuxArg is alway
2bc40 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
2bc50 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
2bc60 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
2bc70 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2bc80 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20  ert( iAuxArg!=0 
2bc90 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
2bca0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2bcb0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2bcc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2bcd0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2bce0 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
2bcf0 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
2bd00 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2bd10 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2bd20 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29  AUSE)!=0.      )
2bd30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2bd40 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66  s is one term of
2bd50 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74   an OR-optimizat
2bd60 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52  ion using the PR
2bd70 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20  IMARY KEY of a. 
2bd80 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55         ** WITHOU
2bd90 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
2bda0 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65  No need for a se
2bdb0 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a  parate index */.
2bdc0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2bdd0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
2bde0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  Cur;.        op 
2bdf0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2be00 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2be10 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2be20 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  FF ){.        In
2be30 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
2be40 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
2be50 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
2be60 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  Cur = iAuxArg;. 
2be70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
2be80 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2be90 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2bea0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
2beb0 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
2bec0 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
2bed0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2bee0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
2bef0 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
2bf00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf10 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
2bf20 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
2bf30 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2bf40 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
2bf50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bf60 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74 72  iAuxArg && (wctr
2bf70 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2bf80 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20  R_SUBCLAUSE)!=0 
2bf90 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  ){.        iInde
2bfa0 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
2bfb0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2bfc0 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20  ReopenIdx;.     
2bfd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bfe0 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72  iIndexCur = pPar
2bff0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2c000 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
2c010 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64  ->iIdxCur = iInd
2c020 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  exCur;.      ass
2c030 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
2c040 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
2c050 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2c060 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
2c070 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29  ;.      if( op )
2c080 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c090 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
2c0a0 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
2c0b0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
2c0c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c0d0 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
2c0e0 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
2c0f0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
2c100 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2c110 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a  _CONSTRAINT)!=0.
2c120 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f           && (pLo
2c130 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
2c140 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2c150 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  E|WHERE_SKIPSCAN
2c160 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ))==0.         &
2c170 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2c180 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
2c190 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20  RBY_MIN)==0.    
2c1a0 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
2c1b0 65 44 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45  eDistinct!=WHERE
2c1c0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2c1d0 44 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  D.        ){.   
2c1e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c1f0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2c200 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a  FLAG_SEEKEQ); /*
2c210 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20   Hint to COMDB2 
2c220 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
2c230 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c240 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
2c250 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
2c260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2c270 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
2c280 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2c290 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d     u64 colUsed =
2c2a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2c2b0 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20  t ii, jj;.      
2c2c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2c2d0 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  <pIx->nColumn; i
2c2e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2c2f0 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f    jj = pIx->aiCo
2c300 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20  lumn[ii];.      
2c310 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29        if( jj<0 )
2c320 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c330 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33         if( jj>63
2c340 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20   ) jj = 63;.    
2c350 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
2c360 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  bItem->colUsed &
2c370 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30   MASKBIT(jj))==0
2c380 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c390 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
2c3a0 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69   |= ((u64)1)<<(i
2c3b0 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b  i<63 ? ii : 63);
2c3c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c3d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c3e0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2c3f0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2c400 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c  iIndexCur, 0, 0,
2c410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c430 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20   (u8*)&colUsed, 
2c440 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  P4_INT64);.     
2c450 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
2c460 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
2c470 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f  UMN_USED_MASK */
2c480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c490 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
2c4a0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
2c4b0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
2c4c0 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
2c4d0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
2c4e0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2c4f0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
2c500 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2c510 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2c520 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
2c530 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2c540 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
2c550 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2c560 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
2c570 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
2c580 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
2c590 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
2c5a0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
2c5b0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
2c5c0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2c5d0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
2c5e0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
2c5f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
2c600 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
2c610 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20    int wsFlags;. 
2c620 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2c630 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  nfo->a[ii];.    
2c640 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  wsFlags = pLevel
2c650 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2c660 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
2c670 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2c680 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
2c690 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2c6a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c6b0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
2c6c0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
2c6d0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
2c6e0 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
2c6f0 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
2c700 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
2c710 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2c720 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
2c730 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
2c740 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c750 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2c760 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
2c770 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78  endif.    addrEx
2c780 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  plain = sqlite3W
2c790 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
2c7a0 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  an(.        pPar
2c7b0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
2c7c0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
2c7d0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
2c7e0 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  ags.    );.    p
2c7f0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20  Level->addrBody 
2c800 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2c810 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2c820 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69   notReady = sqli
2c830 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c  te3WhereCodeOneL
2c840 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
2c850 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a   ii, notReady);.
2c860 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
2c870 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
2c880 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66  addrCont;.    if
2c890 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45  ( (wsFlags&WHERE
2c8a0 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26  _MULTI_OR)==0 &&
2c8b0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
2c8c0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2c8d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2c8e0 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e  ite3WhereAddScan
2c8f0 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69  Status(v, pTabLi
2c900 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72  st, pLevel, addr
2c910 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a  Explain);.    }.
2c920 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
2c930 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
2c940 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
2c950 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  n WHERE-core"));
2c960 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
2c970 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
2c980 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
2c990 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
2c9a0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
2c9b0 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
2c9c0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2c9d0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2c9e0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
2c9f0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2ca00 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
2ca10 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2ca20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
2ca30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
2ca40 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
2ca50 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
2ca60 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
2ca70 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2ca80 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
2ca90 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2caa0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2cab0 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
2cac0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2cad0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
2cae0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2caf0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
2cb00 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2cb10 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2cb20 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
2cb30 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2cb40 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2cb50 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2cb60 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2cb70 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2cb80 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2cb90 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
2cba0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
2cbb0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2cbc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2cbd0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2cbe0 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
2cbf0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
2cc00 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61   i--){.    int a
2cc10 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ddr;.    pLevel 
2cc20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
2cc30 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2cc40 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
2cc50 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
2cc60 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e  =OP_Noop ){.#ifn
2cc70 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2cc80 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2cc90 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e 74 20  TINCT.      int 
2cca0 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20  addrSeek = 0;.  
2ccb0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2ccc0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2ccd0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2cce0 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
2ccf0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2cd00 44 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f  D.       && (pLo
2cd10 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2cd20 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
2cd30 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20         && (pIdx 
2cd40 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2cd50 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61  .pIndex)->hasSta
2cd60 74 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20  t1.       && (n 
2cd70 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2cd80 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20  .nIdxCol)>0.    
2cd90 20 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f     && pIdx->aiRo
2cda0 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20  wLogEst[n]>=36. 
2cdb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cdc0 69 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d  int r1 = pParse-
2cdd0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
2cde0 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20   int j, op;.    
2cdf0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
2ce00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2ce10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ce20 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2ce30 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
2ce40 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20  r, j, r1+j);.   
2ce50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2ce60 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
2ce70 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  +1;.        op =
2ce80 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2ce90 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54  Prev ? OP_SeekLT
2cea0 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20   : OP_SeekGT;.  
2ceb0 20 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d        addrSeek =
2cec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ced0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65  p4Int(v, op, pLe
2cee0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c  vel->iIdxCur, 0,
2cef0 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20   r1, n);.       
2cf00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2cf10 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  v, op==OP_SeekLT
2cf20 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2cf30 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
2cf40 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20  =OP_SeekGT);.   
2cf50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cf60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2cf70 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  o, 1, pLevel->p2
2cf80 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2cf90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41  f /* SQLITE_DISA
2cfa0 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49  BLE_SKIPAHEAD_DI
2cfb0 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20  STINCT */.      
2cfc0 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
2cfd0 73 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  se: Advance to t
2cfe0 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  he next row */. 
2cff0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d000 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2d010 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2d020 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d030 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c  VdbeAddOp3(v, pL
2d040 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
2d050 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
2d060 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20  , pLevel->p3);. 
2d070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d080 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
2d090 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56  el->p5);.      V
2d0a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2d0b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2d0c0 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2d0d0 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20  op==OP_Next);.  
2d0e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2d0f0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2d100 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
2d110 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2d120 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
2d130 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64  OP_VNext);.#ifnd
2d140 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2d150 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54  E_SKIPAHEAD_DIST
2d160 49 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61  INCT.      if( a
2d170 64 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65  ddrSeek ) sqlite
2d180 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2d190 20 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64   addrSeek);.#end
2d1a0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
2d1b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2d1c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2d1d0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2d1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d1f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2d200 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
2d210 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
2d220 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
2d230 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
2d240 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2d250 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d260 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2d270 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
2d280 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
2d290 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
2d2a0 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
2d2b0 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
2d2c0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
2d2d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d2e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2d2f0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
2d300 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
2d310 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21  pIn->eEndLoopOp!
2d320 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
2d330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d340 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
2d350 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
2d360 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
2d370 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
2d380 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2d390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2d3a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2d3b0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
2d3c0 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a  OP_PrevIfOpen);.
2d3d0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2d3e0 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
2d3f0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
2d400 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20  NextIfOpen);.   
2d410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2d420 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d430 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
2d440 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
2d450 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2d460 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2d470 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2d480 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
2d490 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2d4a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d4b0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
2d4c0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
2d4d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d4e0 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
2d4f0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
2d500 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2d510 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
2d520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d530 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2d540 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
2d550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d560 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2d570 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
2d580 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2d590 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
2d5a0 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20  _MATCH_BLOBS.   
2d5b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
2d5c0 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20  rLikeRep ){.    
2d5d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d5e0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
2d5f0 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c  mpZero, (int)(pL
2d600 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
2d610 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20  tr>>1),.        
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d630 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
2d640 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Rep);.      Vdbe
2d650 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2d660 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
2d670 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
2d680 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
2d690 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
2d6a0 6c 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72  lags;.      addr
2d6b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2d6c0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
2d6d0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
2d6e0 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  oin); VdbeCovera
2d6f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  ge(v);.      ass
2d700 65 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45  ert( (ws & WHERE
2d710 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c  _IDX_ONLY)==0 ||
2d720 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
2d730 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
2d740 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
2d750 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
2d760 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d770 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2d780 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
2d790 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2d7a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2d7b0 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
2d7c0 45 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20  E_INDEXED) .    
2d7d0 20 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45     || ((ws & WHE
2d7e0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20  RE_MULTI_OR) && 
2d7f0 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
2d800 78 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  x) .      ){.   
2d810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d820 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
2d830 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
2d840 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
2d850 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
2d860 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
2d870 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2d880 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d890 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
2d8a0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
2d8b0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
2d8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2d8d0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2d8e0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2d8f0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
2d900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d910 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
2d920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
2d930 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2d940 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
2d950 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
2d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d970 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2d980 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2d990 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
2d9a0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
2d9b0 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
2d9c0 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
2d9d0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2d9e0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
2d9f0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
2da00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2da10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
2da20 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
2da30 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2da40 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
2da50 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
2da60 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
2da70 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
2da80 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
2da90 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
2daa0 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
2dab0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
2dac0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
2dad0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2dae0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2daf0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2db00 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2db10 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2db20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
2db30 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
2db40 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
2db50 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2db60 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
2db70 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
2db80 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
2db90 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
2dba0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
2dbb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
2dbc0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43  outine into OP_C
2dbd0 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  opy of result co
2dbe0 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67  ntained in a reg
2dbf0 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50  ister..    ** OP
2dc00 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f  _Rowid becomes O
2dc10 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  P_Null..    */. 
2dc20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
2dc30 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2dc40 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
2dc50 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  se( pParse->db->
2dc60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2dc70 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
2dc80 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72  olumnToCopy(pPar
2dc90 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  se, pLevel->addr
2dca0 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Body, pLevel->iT
2dcb0 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
2dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcd0 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67     pTabItem->reg
2dce0 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20  Result, 0);.    
2dcf0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2dd00 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
2dd10 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
2dd20 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
2dd30 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
2dd40 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
2dd50 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
2dd60 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
2dd70 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2dd80 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
2dd90 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
2dda0 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
2ddb0 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
2ddc0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
2ddd0 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
2dde0 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
2ddf0 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
2de00 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
2de10 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
2de20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
2de30 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
2de40 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
2de50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2de60 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
2de70 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
2de80 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
2de90 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
2dea0 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
2deb0 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
2dec0 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
2ded0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
2dee0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
2def0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
2df00 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
2df10 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
2df20 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
2df30 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
2df40 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
2df50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2df60 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2df70 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
2df80 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
2df90 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
2dfa0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2dfb0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
2dfc0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2dfd0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
2dfe0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
2dff0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
2e000 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
2e010 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20    if( pIdx.     
2e020 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  && (pWInfo->eOne
2e030 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2e040 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  F || !HasRowid(p
2e050 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20  Idx->pTable)).  
2e060 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f     && !db->mallo
2e070 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20  cFailed.    ){. 
2e080 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
2e090 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2e0a0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d  dr(v);.      k =
2e0b0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
2e0c0 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  y;.      pOp = s
2e0d0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2e0e0 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  v, k);.      for
2e0f0 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  (; k<last; k++, 
2e100 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
2e110 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
2e120 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
2e130 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2e140 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2e150 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
2e160 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d           int x =
2e170 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
2e180 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
2e190 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  ->pTable==pTab )
2e1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e1b0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2e1c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ){.            I
2e1d0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
2e1e0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2e1f0 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
2e200 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61        x = pPk->a
2e210 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20  iColumn[x];.    
2e220 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e230 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
2e240 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20    }.          x 
2e250 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
2e260 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b  fIndex(pIdx, x);
2e270 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
2e280 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2e290 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a     pOp->p2 = x;.
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
2e2b0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2e2c0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2e2d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2e2e0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2e2f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2e300 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d  _ONLY)==0 || x>=
2e310 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
2e320 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65   || pWInfo->eOne
2e330 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20  Pass );.        
2e340 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
2e350 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
2e360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
2e370 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2e380 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2e390 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
2e3a0 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
2e3b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2e3c0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2e3d0 66 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  fNullRow ){.    
2e3e0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
2e3f0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2e400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e410 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2e420 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
2e430 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
2e440 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
2e450 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
2e460 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
2e470 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
2e480 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.