/ Hex Artifact Content
Login

Artifact 5f91be9fe122e847c4e72d54d3989eb32a927981:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
1950: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
1960: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
1970: 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70  = pScan->aiCur[p
1980: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
1990: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
19a0: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
19b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
19c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
19d0: 3d 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63  ==XN_EXPR && pSc
19e0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20  an->pIdxExpr==0 
19f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a00: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
1a10: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
1a20: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a30: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a40: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a60: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a70: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a80: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a90: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1aa0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1ab0: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1ac0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ad0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ae0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1af0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1b00: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1b10: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b20: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b30: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b40: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b50: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1ba0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1bb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1bc0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bd0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1be0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bf0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1c00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c20: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c50: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c60: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c80: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1ca0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1cb0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1cc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d40: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d60: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d70: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1da0: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1dd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1de0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e00: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1e10: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e30: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e40: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e50: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e70: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1eb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ec0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1f00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1f10: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f20: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f70: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1fa0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1fb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ff0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
2000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2010: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2020: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2030: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2060: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2070: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2100: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
2110: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2130: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2140: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2150: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2160: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2170: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2180: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2190: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21c0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
2200: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
2210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2220: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
2230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2240: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
2250: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
2260: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2270: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
2280: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
2290: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
22a0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
22b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
22c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
22e0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
22f0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2310: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2320: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2330: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2340: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2360: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2370: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2380: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2390: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
23a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
23b0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
23c0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
23d0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
23e0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
23f0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2400: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2410: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2420: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2430: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2440: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2450: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2460: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2470: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2480: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2490: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
24a0: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
24b0: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
24c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24d0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
24e0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
24f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2500: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2510: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2520: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2530: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2540: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2550: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2560: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2570: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2580: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2590: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
25a0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
25b0: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
25c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
25d0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
25e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
25f0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2600: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2610: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2620: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2630: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2640: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2650: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2660: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2670: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2680: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
26b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
26f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2700: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2710: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2720: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
2730: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
2740: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2750: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2760: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2770: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2780: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2790: 0a 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  .){.  int j = 0;
27a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
27b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
27c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
27d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
27e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
27f0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2800: 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20  >pIdxExpr = 0;. 
2810: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2820: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2830: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2850: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2860: 58 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d  XN_EXPR ) pScan-
2870: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2880: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
28a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
28b0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
28c0: 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
28d0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  D;.  }.  if( pId
28e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
28f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
2900: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
2910: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
2930: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2940: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2950: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2960: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2970: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2980: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2990: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
29a0: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
29b0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
29c0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
29d0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
29e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
29f0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2a00: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2a10: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2a20: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2a30: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2a50: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a70: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2a80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2a90: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2aa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ab0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2ac0: 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20  able iCur or of 
2ad0: 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66  index pIdx.** if
2ae0: 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70   pIdx!=0 and <op
2af0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  > is one of the 
2b00: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
2b10: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
2b20: 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61  y.** the op para
2b30: 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61  meter.  Return a
2b40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b50: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
2b60: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2b70: 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74  .** If pIdx!=0 t
2b80: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f  hen it must be o
2b90: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2ba0: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2bb0: 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72    .** Search for
2bc0: 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20   terms matching 
2bd0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2be0: 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a  olumn of pIdx.**
2bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
2c00: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
2c10: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2c30: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
2c40: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
2c50: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
2c60: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
2c70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c80: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
2c90: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
2ca0: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
2cb0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
2cc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
2cd0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
2ce0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
2cf0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
2d00: 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75  * aiCur[]/iaColu
2d10: 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64  mn[] arrays hold
2d20: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
2d30: 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72  quivalents. Ther
2d40: 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74  e are 11.** slot
2d50: 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43  s in aiCur[]/aiC
2d60: 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20  olumn[] so that 
2d70: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
2d80: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
2d90: 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65  to 10.** other e
2da0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
2db0: 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  .  Hence a searc
2dc0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
2dd0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
2de0: 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20  A1.** and A1=A2 
2df0: 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e  and A2=A3 and ..
2e00: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
2e10: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
2e20: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
2e30: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
2e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2e50: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
2e60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
2e70: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
2e80: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
2e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
2ea0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
2eb0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
2ec0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
2ed0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
2ee0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
2ef0: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
2f00: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
2f10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
2f20: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
2f30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
2f40: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
2f50: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
2f60: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
2f70: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
2f80: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
2f90: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
2fa0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
2fb0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
2fc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
2fd0: 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54  EQUIV..*/.WhereT
2fe0: 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72  erm *sqlite3Wher
2ff0: 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  eFindTerm(.  Whe
3000: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3010: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3020: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3030: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3040: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3050: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3060: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3070: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3080: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3090: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
30a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
30c0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
30d0: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
30e0: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3100: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3110: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3120: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3130: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3140: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3150: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3160: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3170: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3180: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
3190: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
31a0: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
31b0: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
31c0: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
31d0: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
31e0: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
31f0: 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f    op &= WO_EQ|WO
3200: 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  _IS;.  while( p 
3210: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ){.    if( (p->p
3220: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3230: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
3240: 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
3250: 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e  Right==0 && (p->
3260: 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30  eOperator&op)!=0
3270: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
3280: 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74  case( p->eOperat
3290: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
32a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
32b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c0: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
32d0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
32e0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
32f0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
3300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3310: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  sult;.}../*.** T
3320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
3330: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
3340: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
3350: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
3360: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
3370: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
3380: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
3390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
33a0: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
33b0: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
33c0: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
33d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
33e0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
33f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3400: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
3410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3450: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
3460: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3470: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
3480: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
3490: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b0: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
34c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
34d0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
34e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3500: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
3510: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
3520: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3540: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
3550: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
3560: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3570: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
3580: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
3590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
35a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
35b0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
35c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
35d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
35e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
35f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3600: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
3610: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
3620: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
3630: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3640: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
3650: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3670: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
3680: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3690: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
36a0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
36b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
36c0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
36d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
36e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3710: 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c  TRUE if the iCol
3720: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
3730: 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20  dex pIdx is NOT 
3740: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
3750: 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  nt indexColumnNo
3760: 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64  tNull(Index *pId
3770: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
3780: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
3790: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73   pIdx!=0 );.  as
37a0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
37b0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
37c0: 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64  umn );.  j = pId
37d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
37e0: 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b  ];.  if( j>=0 ){
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78  .    return pIdx
3800: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
3810: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c  ].notNull;.  }el
3820: 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29  se if( j==(-1) )
3830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3850: 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a  ert( j==(-2) );.
3860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
3870: 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65  * Assume an inde
3880: 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63  xed expression c
3890: 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20  an always yield 
38a0: 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d  a NULL */..  }.}
38b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
38c0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
38d0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
38e0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
38f0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3900: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3910: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3920: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3930: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3940: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3960: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3970: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3980: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3990: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
39a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
39b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
39c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
39f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3a00: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3a10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3a20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a30: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3a40: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3a50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3a60: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3a70: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3a80: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3a90: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3aa0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3ab0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
3ac0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
3af0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
3b00: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3b10: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3b20: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3b30: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3b40: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3b50: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3b60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3b70: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3b80: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3b90: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3ba0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
3bb0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
3bc0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
3bd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3be0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
3bf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3c00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3c10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3c20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3c30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3c40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3c50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3c60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3c70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3c80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3c90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3ca0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
3cb0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
3cc0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
3cd0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3ce0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
3cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3d00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3d10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3d20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3d40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3d50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3d60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3d70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3d90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3da0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
3db0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
3dc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
3dd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
3de0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3df0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
3e00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3e10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3e20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3e30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3e40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3e50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3e60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3e70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3e80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3e90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3ea0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3eb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
3ec0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
3ed0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
3ee0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
3ef0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
3f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3f10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3f20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3f30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3f40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3f50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3f60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3f70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3f80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3f90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3fa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3fb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
3fc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
3fd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
3fe0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
3ff0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4000: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
4010: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4020: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
4030: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4040: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
4050: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
4060: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4070: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
4080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4090: 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46  0==sqlite3WhereF
40a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
40b0: 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b  se, i, ~(Bitmask
40c0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
40d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
40e0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
40f0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
4100: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c  iBase, pIdx, i)<
4110: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4120: 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75     if( indexColu
4130: 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  mnNotNull(pIdx, 
4140: 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i)==0 ) break;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4160: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
4170: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
4180: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
4190: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
41a0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
41b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
41c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
41e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
41f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
4200: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
4210: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
4220: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
4230: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
4240: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
4250: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
4260: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
4270: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
4280: 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d  Convert OP_Colum
4290: 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f  n opcodes to OP_
42a0: 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73  Copy in previous
42b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ly generated cod
42c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
42d0: 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20  utine runs over 
42e0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
42f0: 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74  ode and translat
4300: 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20  es OP_Column.** 
4310: 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f  opcodes into OP_
4320: 43 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61  Copy when the ta
4330: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63  ble is being acc
4340: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
4350: 74 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64  tine .** instead
4360: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4370: 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  okup..**.** If t
4380: 68 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61  he bIncrRowid pa
4390: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
43a0: 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20  en any OP_Rowid 
43b0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a  instructions on.
43c0: 2a 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75  ** cursor iTabCu
43d0: 72 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  r are transforme
43e0: 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20  d into OP_Null. 
43f0: 4f 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69  Or, if bIncrRowi
4400: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  d is non-zero,.*
4410: 2a 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52  * then each OP_R
4420: 6f 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72  owid is transfor
4430: 6d 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  med into an inst
4440: 72 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65  ruction to incre
4450: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ment the.** valu
4460: 65 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20  e stored in its 
4470: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e  output register.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
44a0: 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76  oCopy(.  Vdbe *v
44b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
44c0: 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e  The VDBE contain
44d0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e  ing code to tran
44e0: 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  slate */.  int i
44f0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4500: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4520: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4530: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4540: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4550: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4560: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4570: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4580: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4590: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
45a0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
45c0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
45d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
45e0: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
45f0: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4600: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
4610: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4620: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4630: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4650: 64 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20  ddr(v);.  for(; 
4660: 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74  iStart<iEnd; iSt
4670: 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  art++, pOp++){. 
4680: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
4690: 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
46a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ue;.    if( pOp-
46b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
46c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  mn ){.      pOp-
46d0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
46e0: 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  y;.      pOp->p1
46f0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65   = pOp->p2 + iRe
4700: 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f  gister;.      pO
4710: 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b  p->p2 = pOp->p3;
4720: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  .      pOp->p3 =
4730: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
4740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4750: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
4760: 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20   if( bIncrRowid 
4770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
4780: 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
4790: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
47a0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P2 operand of th
47b0: 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20  e OP_Rowid. */. 
47c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
47d0: 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a  de = OP_AddImm;.
47e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
47f0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4800: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a     pOp->p2 = 1;.
4810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4820: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4830: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
4840: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b      pOp->p1 = 0;
4850: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
4860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4880: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
4890: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
48a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
48b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
48c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
48d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
48e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
48f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
4900: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
4910: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
4920: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
4930: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
4940: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
4950: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4970: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
4980: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
4990: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
49a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
49b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
49c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
49d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
49e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
49f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4a00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4a10: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4a20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4a30: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
4a40: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
4a50: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
4a60: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
4a70: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4a80: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4a90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4aa0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4ab0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
4ac0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4ad0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
4ae0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4af0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
4b00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4b10: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4b30: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4b40: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
4b50: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
4b60: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4b70: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
4b80: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
4b90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
4ba0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
4bb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
4bc0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
4bd0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
4be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
4bf0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4c10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4c20: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4c30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c40: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
4c50: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
4c60: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4c70: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4c80: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
4c90: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
4ca0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4cb0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
4cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
4cd0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
4ce0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
4cf0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
4d00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d10: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
4d20: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
4d30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
4d50: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
4d60: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
4d70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4d80: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
4d90: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
4da0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
4dd0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
4de0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
4df0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
4e00: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
4e10: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
4e20: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
4e30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
4e50: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
4e60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e80: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
4e90: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
4ea0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
4eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
4ec0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
4ed0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
4ee0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
4ef0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
4f00: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
4f10: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
4f20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
4f50: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
4f60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4f70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
4f80: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
4f90: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
4fa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4fb0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
4fc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
4fd0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
4fe0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
4ff0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
5000: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5010: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
5020: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
5030: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
5040: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
5050: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75  O_IS))==0 ) retu
5060: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5070: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5080: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
5090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
50a0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
50b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
50c0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
50d0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
50e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
50f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
5100: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5110: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
5120: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
5130: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
5140: 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
5150: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
5160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5170: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
5180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5190: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
51a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
51b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
51c0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
51d0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
51e0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
51f0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
5200: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
5210: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
5220: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
5230: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
5240: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
5270: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
5280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
52a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
52b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
52c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
52d0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
52e0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
52f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5300: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
5310: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
5320: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
5330: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
5340: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
5350: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
5360: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
5370: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
5380: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5390: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
53a0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
53b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
53c0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
53d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
53e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
53f0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
5400: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
5410: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
5430: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
5440: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5450: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
5460: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
5470: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
5480: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
5490: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
54a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
54b0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
54c0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
54d0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
5500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
5510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
5520: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
5530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5540: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
5550: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
5560: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
5570: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
5580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5590: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
55a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
55b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
55c0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
55d0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
55e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
55f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5600: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5610: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
5620: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
5650: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5680: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5690: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
56b0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
56c0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
56d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56f0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5700: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
5710: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
5720: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
5730: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
5740: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
5750: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
5760: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5770: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
5780: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
5790: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
57a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
57b0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
57c0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
57d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
57e0: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
57f0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
5800: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5810: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
5820: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
5830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
5840: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
5850: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
5860: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
5870: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5880: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
5890: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
58a0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
58b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
58c0: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
58d0: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  uded rows */.  s
58e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58f0: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5900: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
5910: 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  rm being indexed
5920: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
5930: 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  unter = 0;      
5940: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65    /* Address whe
5950: 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74  re integer count
5960: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5970: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5980: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
59a0: 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72  egisters where r
59b0: 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c  ecord is assembl
59c0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
59d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
59e0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
59f0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
5a00: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
5a10: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
5a20: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
5a30: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
5a40: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
5a50: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5a70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
5a80: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  rInit = sqlite3V
5a90: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
5aa0: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
5ab0: 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f  age(v);..  /* Co
5ac0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
5ad0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
5ae0: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
5af0: 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
5b00: 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
5b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
5b20: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
5b30: 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  KeyCol = 0;.  pT
5b40: 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
5b50: 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
5b60: 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
5b70: 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
5b80: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69  vel->pWLoop;.  i
5b90: 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
5ba0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
5bb0: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
5bc0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
5bd0: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
5be0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
5bf0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
5c00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
5c10: 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70  romJoin)    /* p
5c20: 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e  rereq always non
5c30: 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20  -zero */.       
5c40: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67    || pExpr->iRig
5c50: 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72  htJoinTable!=pSr
5c60: 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20  c->iCursor   /* 
5c70: 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d    for the right-
5c80: 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20  hand   */.      
5c90: 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65     || pLoop->pre
5ca0: 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20  req!=0 );       
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5cc0: 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45     table of a LE
5cd0: 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69  FT JOIN */.    i
5ce0: 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71  f( pLoop->prereq
5cf0: 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
5d00: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
5d10: 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20  RM_VIRTUAL)==0. 
5d20: 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
5d30: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
5d40: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
5d50: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
5d60: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
5d70: 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72  Expr, pSrc->iCur
5d80: 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50  sor) ){.      pP
5d90: 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33  artial = sqlite3
5da0: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
5db0: 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20  db, pPartial,.  
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
5de0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
5df0: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
5e00: 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  0));.    }.    i
5e10: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
5e20: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
5e30: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
5e40: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
5e50: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
5e60: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
5e70: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
5e80: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
5e90: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
5ea0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
5eb0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
5ec0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
5ed0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
5ee0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65  );.      if( !se
5ef0: 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20  ntWarning ){.   
5f00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
5f10: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  (SQLITE_WARNING_
5f20: 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20  AUTOINDEX,.     
5f30: 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69         "automati
5f40: 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73  c index on %s(%s
5f50: 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  )", pTable->zNam
5f60: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e,.            p
5f70: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
5f80: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
5f90: 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20    sentWarning = 
5fa0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5fb0: 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
5fc0: 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
5fd0: 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
5fe0: 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d  opResize(pParse-
5ff0: 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79  >db, pLoop, nKey
6000: 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20  Col+1) ){.      
6010: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74      goto end_aut
6020: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a  o_index_create;.
6030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6040: 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
6050: 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65  nKeyCol++] = pTe
6060: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  rm;.        idxC
6070: 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
6080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6090: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f    assert( nKeyCo
60a0: 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  l>0 );.  pLoop->
60b0: 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c  u.btree.nEq = pL
60c0: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b  oop->nLTerm = nK
60d0: 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  eyCol;.  pLoop->
60e0: 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
60f0: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
6100: 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
6110: 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20  RE_INDEXED.     
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  | WHERE_AUTO_IND
6140: 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  EX;..  /* Count 
6150: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64  the number of ad
6160: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
6170: 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74   needed to creat
6180: 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e  e a.  ** coverin
6190: 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76  g index.  A "cov
61a0: 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20  ering index" is 
61b0: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
61c0: 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20  ntains all.  ** 
61d0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
61e0: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71   needed by the q
61f0: 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f  uery.  With a co
6200: 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  vering index, th
6210: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
6220: 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64  table never need
6230: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
6240: 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  .  Automatic ind
6250: 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ices must.  ** b
6260: 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
6270: 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69  ex because the i
6280: 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
6290: 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a   updated if the.
62a0: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
62b0: 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ble changes and 
62c0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
62d0: 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ble cannot both 
62e0: 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20  be used.  ** if 
62f0: 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73  they go out of s
6300: 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72  ync..  */.  extr
6310: 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f  aCols = pSrc->co
6320: 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c  lUsed & (~idxCol
6330: 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  s | MASKBIT(BMS-
6340: 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20  1));.  mxBitCol 
6350: 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62  = MIN(BMS-1,pTab
6360: 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73  le->nCol);.  tes
6370: 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
6380: 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
6390: 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
63a0: 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b  ->nCol==BMS-2 );
63b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
63c0: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
63d0: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
63e0: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e  & MASKBIT(i) ) n
63f0: 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20  KeyCol++;.  }.  
6400: 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
6410: 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
6420: 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f  1) ){.    nKeyCo
6430: 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  l += pTable->nCo
6440: 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d  l - BMS + 1;.  }
6450: 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
6460: 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
6470: 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
6480: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49  is index */.  pI
6490: 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  dx = sqlite3Allo
64a0: 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
64b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
64c0: 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55  Col+1, 0, &zNotU
64d0: 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78  sed);.  if( pIdx
64e0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61  ==0 ) goto end_a
64f0: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
6500: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
6510: 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
6520: 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
6530: 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
6540: 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
6550: 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
6560: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
6570: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
6580: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
6590: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
65a0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
65b0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
65c0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
65d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
65e0: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
65f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
6600: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
6610: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
6620: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
6630: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
6640: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6650: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
6660: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6670: 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  S );.      if( (
6680: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
6690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
66a0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
66b0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
66c0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
66d0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
66e0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
66f0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
6700: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
6710: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
6720: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
6730: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
6740: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
6750: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
6760: 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f  oll[n] = pColl ?
6770: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
6780: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6790: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
67a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
67b0: 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
67c0: 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
67d0: 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
67e0: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
67f0: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
6800: 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
6810: 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
6820: 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
6830: 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
6840: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
6850: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
6860: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
6870: 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
6880: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6890: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
68a0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
68b0: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
68c0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
68d0: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
68e0: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
68f0: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
6900: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
6910: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
6920: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
6930: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
6940: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
6950: 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [n] = sqlite3Str
6960: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b  BINARY;.      n+
6970: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
6980: 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f  ssert( n==nKeyCo
6990: 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  l );.  pIdx->aiC
69a0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f  olumn[n] = XN_RO
69b0: 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  WID;.  pIdx->azC
69c0: 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33  oll[n] = sqlite3
69d0: 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a  StrBINARY;..  /*
69e0: 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
69f0: 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
6a00: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
6a10: 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
6a20: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6a30: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
6a40: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
6a50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6a60: 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
6a70: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65  el->iIdxCur, nKe
6a80: 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  yCol+1);.  sqlit
6a90: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
6aa0: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
6ab0: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
6ac0: 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
6ad0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
6ae0: 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
6af0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
6b00: 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
6b10: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6b20: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
6b30: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d  pTabItem = &pWC-
6b40: 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
6b50: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
6b60: 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49  om];.  if( pTabI
6b70: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6b80: 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
6b90: 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
6ba0: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
6bb0: 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20      addrCounter 
6bc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6bd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6be0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
6bf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c00: 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
6c10: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30  ine, regYield, 0
6c20: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72  , pTabItem->addr
6c30: 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64  FillSub);.    ad
6c40: 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33  drTop =  sqlite3
6c50: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6c60: 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
6c70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
6c80: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
6c90: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
6ca0: 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22  t row of \"%s\""
6cb0: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
6cc0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  ->zName));.  }el
6cd0: 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  se{.    addrTop 
6ce0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6cf0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
6d00: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
6d10: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
6d20: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
6d30: 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69  Partial ){.    i
6d40: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
6d50: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
6d60: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  v);.    sqlite3E
6d70: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
6d80: 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f  e, pPartial, iCo
6d90: 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a  ntinue, SQLITE_J
6da0: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
6db0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
6dc0: 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49  = WHERE_PARTIALI
6dd0: 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63  DX;.  }.  regRec
6de0: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
6df0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6e00: 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c  .  regBase = sql
6e10: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
6e20: 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72  xKey(.      pPar
6e30: 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
6e40: 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
6e50: 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30  cord, 0, 0, 0, 0
6e60: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  .  );.  sqlite3V
6e70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6e80: 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
6e90: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
6ea0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
6eb0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
6ec0: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
6ed0: 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50  ESULT);.  if( pP
6ee0: 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33  artial ) sqlite3
6ef0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6f00: 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
6f10: 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
6f20: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6f30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6f40: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
6f50: 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61  drCounter, regBa
6f60: 73 65 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73  se+n);.    trans
6f70: 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79  lateColumnToCopy
6f80: 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65  (v, addrTop, pLe
6f90: 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54  vel->iTabCur, pT
6fa0: 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c  abItem->regResul
6fb0: 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 1);.    sqlit
6fc0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
6fd0: 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62  drTop);.    pTab
6fe0: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
6ff0: 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  utine = 0;.  }el
7000: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
7010: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7020: 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
7030: 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
7040: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7050: 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
7060: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7070: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
7080: 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
7090: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
70a0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
70b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
70c0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
70d0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
70e0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
70f0: 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a  Pop(pParse);.  .
7100: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
7110: 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
7120: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
7130: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
7140: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
7150: 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f  Init);..end_auto
7160: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20  _index_create:. 
7170: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7180: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
7190: 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64  Partial);.}.#end
71a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
71b0: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
71c0: 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  X */..#ifndef SQ
71d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
71e0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c  LTABLE./*.** All
71f0: 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
7200: 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  te an sqlite3_in
7210: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7220: 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  re. It is the .*
7230: 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
7240: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
7250: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
7260: 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75  ease the structu
7270: 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67  re.** by passing
7280: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   the pointer ret
7290: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
72a0: 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65  nction to sqlite
72b0: 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
72c0: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  tic sqlite3_inde
72d0: 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65  x_info *allocate
72e0: 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72  IndexInfo(.  Par
72f0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68  se *pParse,.  Wh
7300: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a  ereClause *pWC,.
7310: 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61    Bitmask mUnusa
7320: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
7330: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d    /* Ignore term
7340: 73 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65  s with these pre
7350: 72 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  reqs */.  struct
7360: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
7370: 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
7380: 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 75 31 36  *pOrderBy,.  u16
7390: 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20   *pmNoOmit      
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f  Mask of terms no
73c0: 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a  t to omit */.){.
73d0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
73e0: 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
73f0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7400: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
7410: 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
7420: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7430: 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
7440: 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
7450: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7460: 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
7470: 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
7480: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
7490: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
74a0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
74b0: 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e  dxInfo;.  u16 mN
74c0: 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oOmit = 0;..  /*
74d0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
74e0: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
74f0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
7500: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
7510: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
7520: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
7530: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
7540: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7550: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7560: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
7570: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7580: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7590: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
75a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
75b0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
75c0: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
75d0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
75e0: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
75f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7600: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7610: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7620: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7630: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7640: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7650: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
7660: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
7670: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7680: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
7690: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
76a0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
76b0: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
76c0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
76d0: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
76e0: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
76f0: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
7700: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7710: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7720: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
7730: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7740: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
7750: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
7760: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
7770: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
7780: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
7790: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
77a0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
77b0: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
77c0: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
77d0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
77e0: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
77f0: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
7800: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
7810: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
7820: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
7830: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
7840: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
7850: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
7860: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
7870: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
7880: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
7890: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
78a0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
78b0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
78c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
78d0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
78e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
78f0: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
7900: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
7910: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7920: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
7930: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
7940: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
7950: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
7960: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
7970: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
7980: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
79b0: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
79c0: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
79d0: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
7a00: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
7a10: 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
7a20: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
7a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a40: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
7a50: 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
7a60: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
7a70: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
7a80: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
7a90: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7aa0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
7ab0: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
7ac0: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
7ad0: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
7ae0: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
7af0: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
7b00: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
7b10: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
7b20: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
7b30: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
7b40: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
7b50: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
7b60: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
7b70: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7b80: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
7b90: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
7ba0: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
7bb0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7bc0: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
7bd0: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
7be0: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
7bf0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7c00: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
7c10: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
7c20: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
7c30: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
7c40: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
7c50: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7c60: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
7c70: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
7c80: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7c90: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
7ca0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
7cb0: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
7cc0: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
7cd0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
7ce0: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
7cf0: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
7d00: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
7d10: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7d20: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7d30: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
7d40: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
7d50: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
7da0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
7db0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
7dc0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
7dd0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
7de0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7df0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
7e00: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
7e10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7e20: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
7e30: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
7e40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7e50: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
7e60: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
7e70: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
7e80: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
7e90: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7ea0: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
7eb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7ec0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7ed0: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
7ee0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7ef0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
7f00: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
7f10: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7f20: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
7f30: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
7f40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7f50: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
7f60: 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  UIV|WO_IS))==0 )
7f70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7f80: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
7f90: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
7fa0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
7fb0: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e  ssert( pTerm->u.
7fc0: 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29  leftColumn>=(-1)
7fd0: 20 29 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73   );.    pIdxCons
7fe0: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
7ff0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8000: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
8010: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
8020: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
8030: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
8040: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
8050: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
8060: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
8070: 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d 41 54 43 48  if( op==WO_MATCH
8080: 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 70   ){.      op = p
8090: 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b 0a  Term->eMatchOp;.
80a0: 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 43 6f      }.    pIdxCo
80b0: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20  ns[j].op = op;. 
80c0: 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
80d0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
80e0: 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
80f0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
8100: 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  y because.    **
8110: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
8120: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8130: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
8140: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
8150: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
8160: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
8170: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
8180: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
8190: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
81a0: 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
81b0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
81c0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
81d0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
81e0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
81f0: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
8200: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
8210: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
8220: 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
8230: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
8240: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
8250: 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
8260: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
8270: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8280: 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
8290: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
82a0: 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73  _MATCH );.    as
82b0: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
82c0: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c  erator & (WO_IN|
82d0: 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
82e0: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
82f0: 5f 4d 41 54 43 48 29 20 29 3b 0a 0a 20 20 20 20  _MATCH) );..    
8300: 69 66 28 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c  if( op & (WO_LT|
8310: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8320: 45 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  E).     && sqlit
8330: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
8340: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
8350: 67 68 74 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ght) .    ){.   
8360: 20 20 20 69 66 28 20 69 3c 31 36 20 29 20 6d 4e     if( i<16 ) mN
8370: 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20 69  oOmit |= (1 << i
8380: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  );.      if( op=
8390: 3d 57 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e  =WO_LT ) pIdxCon
83a0: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b  s[j].op = WO_LE;
83b0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  .      if( op==W
83c0: 4f 5f 47 54 20 29 20 70 49 64 78 43 6f 6e 73 5b  O_GT ) pIdxCons[
83d0: 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20  j].op = WO_GE;. 
83e0: 20 20 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20     }..    j++;. 
83f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
8400: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
8410: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
8420: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
8430: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
8440: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
8450: 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
8460: 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
8470: 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
8480: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
8490: 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
84a0: 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f  *pmNoOmit = mNoO
84b0: 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  mit;.  return pI
84c0: 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
84d0: 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
84e0: 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
84f0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
8500: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
8510: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
8520: 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
8530: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
8540: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
8550: 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
8560: 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
8570: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
8580: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
8590: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
85a0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
85b0: 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
85c0: 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
85d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
85e0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
85f0: 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
8600: 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
8610: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8620: 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
8630: 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
8640: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
8650: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
8660: 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
8670: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
8680: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8690: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
86a0: 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
86b0: 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
86c0: 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
86d0: 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
86e0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
86f0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
8700: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
8710: 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
8720: 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
8730: 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
8740: 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
8750: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
8760: 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
8770: 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
8780: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
8790: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
87a0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
87b0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
87c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
87d0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
87e0: 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
87f0: 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
8800: 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
8810: 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
8820: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
8830: 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
8840: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
8850: 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
8860: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8870: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8880: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
8890: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
88a0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
88b0: 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
88c0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
88d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
88e0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
88f0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
8900: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
8910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8920: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
8930: 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
8940: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
8950: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
8960: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
8970: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
8980: 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a  = 0;..#if 0.  /*
8990: 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20 6e   This error is n
89a0: 6f 77 20 63 61 75 67 68 74 20 62 79 20 74 68 65  ow caught by the
89b0: 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53 65   caller..  ** Se
89c0: 61 72 63 68 20 66 6f 72 20 22 78 42 65 73 74 49  arch for "xBestI
89d0: 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ndex malfunction
89e0: 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f 72  " below */.  for
89f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
8a00: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
8a10: 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74    if( !p->aConst
8a20: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20  raint[i].usable 
8a30: 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  && p->aConstrain
8a40: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
8a50: 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  dex>0 ){.      s
8a60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8a70: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
8a80: 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65    "table %s: xBe
8a90: 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64  stIndex returned
8aa0: 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e   an invalid plan
8ab0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
8ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8ad0: 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  f..  return pPar
8ae0: 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64  se->nErr;.}.#end
8af0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
8b00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
8b10: 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
8b20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8b30: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
8b40: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
8b50: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
8b60: 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
8b70: 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
8b80: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
8b90: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
8ba0: 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
8bb0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
8bc0: 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
8bd0: 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
8be0: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65  ws less than pRe
8bf0: 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  c.**    aStat[1]
8c00: 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
8c10: 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
8c20: 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65  to pRec.**.** Re
8c30: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
8c40: 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61  f the sample tha
8c50: 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73  t is the smalles
8c60: 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a  t sample that.**
8c70: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
8c80: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
8c90: 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  c. Note that thi
8ca0: 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61  s index is not a
8cb0: 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20  n index.** into 
8cc0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
8cd0: 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69  ray - it is an i
8ce0: 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74  ndex into a virt
8cf0: 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  ual set of sampl
8d00: 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74  es.** based on t
8d10: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
8d20: 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65  Sample[] and the
8d30: 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
8d40: 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20  s in record .** 
8d50: 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  pRec. .*/.static
8d60: 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61   int whereKeySta
8d70: 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
8d80: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
8d90: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
8da0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
8db0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
8dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8dd0: 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
8de0: 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e  omain of */.  Un
8df0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
8e00: 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63  ec,       /* Vec
8e10: 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  tor of values to
8e20: 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
8e30: 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
8e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
8e50: 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
8e60: 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
8e70: 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
8e80: 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
8e90: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
8ea0: 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
8eb0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61   */.){.  IndexSa
8ec0: 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
8ed0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
8ee0: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f00: 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65  Index of require
8f10: 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b  d stats in anEq[
8f20: 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  ] etc. */.  int 
8f30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8f40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8f50: 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65   of first sample
8f60: 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e   >= pRec */.  in
8f70: 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  t iSample;      
8f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61            /* Sma
8f90: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72  llest sample lar
8fa0: 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ger than or equa
8fb0: 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69  l to pRec */.  i
8fc0: 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20  nt iMin = 0;    
8fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
8fe0: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f  allest sample no
8ff0: 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a  t yet tested */.
9000: 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20    int iTest;    
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9020: 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20   Next sample to 
9030: 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  test */.  int re
9040: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
9050: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9060: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  of comparison op
9070: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
9080: 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
9090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
90a0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
90b0: 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  pRec */.  tRowcn
90c0: 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20  t iLower = 0;   
90d0: 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20        /* anLt[] 
90e0: 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67  + anEq[] of larg
90f0: 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20  est sample pRec 
9100: 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  is > */..#ifndef
9110: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9120: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9130: 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64  ( pParse );.#end
9140: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  if.  assert( pRe
9150: 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
9160: 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e  ( pIdx->nSample>
9170: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9180: 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26  Rec->nField>0 &&
9190: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70   pRec->nField<=p
91a0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  Idx->nSampleCol 
91b0: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69  );..  /* Do a bi
91c0: 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20 66  nary search to f
91d0: 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73 61  ind the first sa
91e0: 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68 61  mple greater tha
91f0: 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20  n or equal.  ** 
9200: 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65 63  to pRec. If pRec
9210: 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
9220: 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65  le field, the se
9230: 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20  t of samples to 
9240: 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73  search.  ** is s
9250: 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c  imply the aSampl
9260: 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68  e[] array. If th
9270: 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  e samples in aSa
9280: 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d  mple[] contain m
9290: 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e  ore.  ** than on
92a0: 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69  e fields, all fi
92b0: 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  elds following t
92c0: 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67 6e  he first are ign
92d0: 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored..  **.  ** 
92e0: 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73  If pRec contains
92f0: 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65   N fields, where
9300: 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20   N is more than 
9310: 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c  one, then as wel
9320: 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61  l as the.  ** sa
9330: 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65  mples in aSample
9340: 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f  [] (truncated to
9350: 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20   N fields), the 
9360: 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20  search also has 
9370: 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  to.  ** consider
9380: 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f   prefixes of tho
9390: 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20  se samples. For 
93a0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
93b0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20  set of samples. 
93c0: 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69   ** in aSample i
93d0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
93e0: 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61   aSample[0] = (a
93f0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
9400: 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20  Sample[1] = (a, 
9410: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  10) .  **     aS
9420: 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35  ample[2] = (b, 5
9430: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
9440: 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30  ple[3] = (c, 100
9450: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
9460: 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35  ple[4] = (c, 105
9470: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ).  **.  ** Then
9480: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
9490: 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79  e should ideally
94a0: 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20   be the samples 
94b0: 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20  above and the . 
94c0: 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69   ** unique prefi
94d0: 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64  xes [a], [b] and
94e0: 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20   [c]. But since 
94f0: 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f 20  that is hard to 
9500: 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20  organize, .  ** 
9510: 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c  the code actuall
9520: 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73 20  y searches this 
9530: 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  set:.  **.  **  
9540: 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20     0: (a) .  ** 
9550: 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20      1: (a, 5) . 
9560: 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31   **     2: (a, 1
9570: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20  0) .  **     3: 
9580: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
9590: 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20    4: (b) .  **  
95a0: 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20     5: (b, 5) .  
95b0: 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20  **     6: (c) . 
95c0: 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31   **     7: (c, 1
95d0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a  00) .  **     8:
95e0: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20   (c, 105).  **  
95f0: 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20     9: (c, 105). 
9600: 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63   **.  ** For eac
9610: 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  h sample in the 
9620: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c  aSample[] array,
9630: 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70   N samples are p
9640: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20  resent in the.  
9650: 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ** effective sam
9660: 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68  ple array. In th
9670: 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73  e above, samples
9680: 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61 73   0 and 1 are bas
9690: 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70  ed on .  ** samp
96a0: 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53  le aSample[0]. S
96b0: 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f  amples 2 and 3 o
96c0: 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63  n aSample[1] etc
96d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65  ..  **.  ** Ofte
96e0: 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65  n, sample i of e
96f0: 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65  ach block of N e
9700: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73  ffective samples
9710: 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64   has (i+1) field
9720: 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  s..  ** Except, 
9730: 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20  each sample may 
9740: 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65  be extended to e
9750: 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69 73  nsure that it is
9760: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
9770: 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  .  ** equal to t
9780: 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70  he previous samp
9790: 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  le in the array.
97a0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e   For example, in
97b0: 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a   the above, .  *
97c0: 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68  * sample 2 is th
97d0: 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f  e first sample o
97e0: 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73  f a block of N s
97f0: 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69  amples, so at fi
9800: 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70  rst it .  ** app
9810: 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68 6f  ears that it sho
9820: 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20 69  uld be 1 field i
9830: 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c  n size. However,
9840: 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65   that would make
9850: 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65   it .  ** smalle
9860: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c  r than sample 1,
9870: 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   so the binary s
9880: 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20  earch would not 
9890: 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c  work. As a resul
98a0: 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  t, .  ** it is e
98b0: 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66  xtended to two f
98c0: 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69  ields. The dupli
98d0: 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73 20  cates that this 
98e0: 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a  creates do not .
98f0: 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70    ** cause any p
9900: 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
9910: 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e  nField = pRec->n
9920: 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20  Field;.  iCol = 
9930: 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70  0;.  iSample = p
9940: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e  Idx->nSample * n
9950: 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20  Field;.  do{.   
9960: 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20   int iSamp;     
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9980: 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70  * Index in aSamp
9990: 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d  le[] of test sam
99a0: 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ple */.    int n
99b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
99c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
99d0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
99e0: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a  test sample */..
99f0: 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69      iTest = (iMi
9a00: 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20  n+iSample)/2;.  
9a10: 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20    iSamp = iTest 
9a20: 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66  / nField;.    if
9a30: 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20  ( iSamp>0 ){.   
9a40: 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73     /* The propos
9a50: 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ed effective sam
9a60: 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78 20  ple is a prefix 
9a70: 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c  of sample aSampl
9a80: 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20  e[iSamp]..      
9a90: 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  ** Specifically,
9aa0: 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70 72   the shortest pr
9ab0: 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74  efix of at least
9ac0: 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65   (1 + iTest%nFie
9ad0: 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ld) .      ** fi
9ae0: 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72 65  elds that is gre
9af0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70 72  ater than the pr
9b00: 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76 65  evious effective
9b10: 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20   sample.  */.   
9b20: 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20     for(n=(iTest 
9b30: 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e  % nField) + 1; n
9b40: 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20  <nField; n++){. 
9b50: 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
9b60: 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74  le[iSamp-1].anLt
9b70: 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69  [n-1]!=aSample[i
9b80: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
9b90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
9ba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9bb0: 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b    n = iTest + 1;
9bc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63  .    }..    pRec
9bd0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20  ->nField = n;.  
9be0: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
9bf0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
9c00: 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e  (aSample[iSamp].
9c10: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  n, aSample[iSamp
9c20: 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20  ].p, pRec);.    
9c30: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
9c40: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9c50: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9c60: 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69  n-1] + aSample[i
9c70: 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b  Samp].anEq[n-1];
9c80: 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
9c90: 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
9ca0: 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e   if( res==0 && n
9cb0: 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20  <nField ){.     
9cc0: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
9cd0: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
9ce0: 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
9cf0: 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20   iTest+1;.      
9d00: 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  res = -1;.    }e
9d10: 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70  lse{.      iSamp
9d20: 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20  le = iTest;.    
9d30: 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20    iCol = n-1;.  
9d40: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65    }.  }while( re
9d50: 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c  s && iMin<iSampl
9d60: 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70  e );.  i = iSamp
9d70: 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69  le / nField;..#i
9d80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9d90: 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  G.  /* The follo
9da0: 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
9db0: 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61  ements check tha
9dc0: 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  t the binary sea
9dd0: 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62  rch code.  ** ab
9de0: 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69  ove found the ri
9df0: 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73  ght answer. This
9e00: 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f   block serves no
9e10: 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20   purpose other. 
9e20: 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f   ** than to invo
9e30: 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20  ke the asserts. 
9e40: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
9e50: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9e60: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ed==0 ){.    if(
9e70: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
9e80: 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20   /* If (res==0) 
9e90: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52  is true, then pR
9ea0: 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  ec must be equal
9eb0: 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f   to sample i. */
9ec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9ed0: 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
9ee0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ef0: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
9f00: 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46  ;.      pRec->nF
9f10: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
9f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
9f30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f40: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9f50: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9f60: 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20  ].p, pRec) .    
9f70: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9f80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9f90: 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ed .      );.   
9fa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
9fb0: 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d   Unless i==pIdx-
9fc0: 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61  >nSample, indica
9fd0: 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20 69  ting that pRec i
9fe0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20  s larger than.  
9ff0: 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c      ** all sampl
a000: 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  es in the aSampl
a010: 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20  e[] array, pRec 
a020: 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
a030: 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  than the.      *
a040: 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  * (iCol+1) field
a050: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
a060: 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  e i.  */.      a
a070: 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e  ssert( i<=pIdx->
a080: 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20  nSample && i>=0 
a090: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
a0a0: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a  Field = iCol+1;.
a0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
a0c0: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a  =pIdx->nSample .
a0d0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
a0e0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a0f0: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a100: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a110: 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20  p, pRec)>0.     
a120: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
a130: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
a140: 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  d );..      /* i
a150: 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d  f i==0 and iCol=
a160: 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  =0, then record 
a170: 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20  pRec is smaller 
a180: 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  than all samples
a190: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
a1a0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
a1b0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
a1c0: 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52  (iCol>0) then pR
a1d0: 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  ec must.      **
a1e0: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
a1f0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
a200: 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72   (iCol) field pr
a210: 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69  efix of sample i
a220: 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69  ..      ** If (i
a230: 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d  >0), then pRec m
a240: 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61  ust also be grea
a250: 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ter than sample 
a260: 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20  (i-1).  */.     
a270: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
a280: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
a290: 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  eld = iCol;.    
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a2b0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
a2c0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
a2d0: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
a2e0: 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20   pRec)<=0.      
a2f0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
a300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a310: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
a320: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
a330: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
a340: 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20  eld = nField;.  
a350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a360: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a370: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a380: 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
a390: 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20  -1].p, pRec)<0. 
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a3b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
a3c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
a3d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
a3e0: 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
a3f0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20  ITE_DEBUG */..  
a400: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
a410: 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63    /* Record pRec
a420: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d   is equal to sam
a430: 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73  ple i */.    ass
a440: 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c  ert( iCol==nFiel
a450: 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74  d-1 );.    aStat
a460: 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
a470: 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
a480: 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d   aStat[1] = aSam
a490: 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c  ple[i].anEq[iCol
a4a0: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
a4b0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
a4c0: 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66  , the (iCol+1) f
a4d0: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61  ield prefix of a
a4e0: 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
a4f0: 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73   first .    ** s
a500: 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
a510: 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e  eater than pRec.
a520: 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d   Or, if i==pIdx-
a530: 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52  >nSample then pR
a540: 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72  ec.    ** is lar
a550: 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ger than all sam
a560: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72 61  ples in the arra
a570: 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e  y. */.    tRowcn
a580: 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  t iUpper, iGap;.
a590: 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d      if( i>=pIdx-
a5a0: 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >nSample ){.    
a5b0: 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74    iUpper = sqlit
a5c0: 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49  e3LogEstToInt(pI
a5d0: 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
a5e0: 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
a5f0: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
a600: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
a610: 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Col];.    }..   
a620: 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70   if( iLower>=iUp
a630: 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61  per ){.      iGa
a640: 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
a650: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
a660: 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a  Upper - iLower;.
a670: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f      }.    if( ro
a680: 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69  undUp ){.      i
a690: 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33  Gap = (iGap*2)/3
a6a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a6b0: 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33     iGap = iGap/3
a6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
a6d0: 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20  t[0] = iLower + 
a6e0: 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b  iGap;.    aStat[
a6f0: 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45  1] = pIdx->aAvgE
a700: 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20  q[iCol];.  }..  
a710: 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 70  /* Restore the p
a720: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75  Rec->nField valu
a730: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
a740: 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e  ng.  */.  pRec->
a750: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
a760: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23  .  return i;.}.#
a770: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a780: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
a790: 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
a7a0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
a7b0: 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
a7c0: 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
a7d0: 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
a7e0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
a7f0: 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
a800: 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
a810: 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
a820: 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
a830: 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
a840: 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
a850: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
a860: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
a870: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
a880: 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
a890: 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
a8a0: 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
a8b0: 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
a8c0: 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
a8d0: 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
a8e0: 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
a8f0: 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
a900: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
a910: 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
a920: 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
a930: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
a940: 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
a950: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
a960: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
a970: 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
a980: 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
a990: 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
a9a0: 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
a9b0: 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
a9c0: 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
a9d0: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
a9e0: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
a9f0: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
aa00: 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
aa10: 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
aa20: 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
aa30: 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
aa40: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
aa50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
aa60: 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
aa70: 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
aa80: 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
aa90: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
aaa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
aab0: 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
aac0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
aad0: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
aae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
aaf0: 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69  urn nRet;.}...#i
ab00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ab10: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
ab20: 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  4./*.** Return t
ab30: 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20  he affinity for 
ab40: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
ab50: 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  of an index..*/.
ab60: 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65  char sqlite3Inde
ab70: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
ab80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
ab90: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43  ex *pIdx, int iC
aba0: 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ol){.  assert( i
abb0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
abc0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
abd0: 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f    if( !pIdx->zCo
abe0: 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20  lAff ){.    if( 
abf0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
ac00: 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49 64 78  nityStr(db, pIdx
ac10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
ac20: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
ac30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78   }.  return pIdx
ac40: 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b  ->zColAff[iCol];
ac50: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  .}.#endif...#ifd
ac60: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ac70: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
ac80: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
ac90: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
aca0: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
acb0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
acc0: 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61  sited by a.** ra
acd0: 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b  nge-scan on a sk
ace0: 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46  ip-scan index. F
acf0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
ad00: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
ad10: 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20   i1 ON t1(a, b, 
ad20: 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  c);.**   SELECT 
ad30: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
ad40: 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45  a=? AND c BETWEE
ad50: 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a  N ? AND ?;.**.**
ad60: 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f   Value pLoop->nO
ad70: 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ut is currently 
ad80: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
ad90: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
ada0: 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  ows .** visited 
adb0: 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d  for scanning (a=
adc0: 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73  ? AND b=?). This
add0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65   function reduce
ade0: 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65 20  s that estimate 
adf0: 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74  .** by some fact
ae00: 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  or to account fo
ae10: 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45 4e  r the (c BETWEEN
ae20: 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73   ? AND ?) expres
ae30: 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e  sion based.** on
ae40: 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61 20   the stat4 data 
ae50: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74  for the index. t
ae60: 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65  his scan will be
ae70: 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70   peformed multip
ae80: 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e  le .** times (on
ae90: 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62  ce for each (a,b
aea0: 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68  ) combination th
aeb0: 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20  at matches a=?) 
aec0: 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a  is dealt with .*
aed0: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
aee0: 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74  .**.** It does t
aef0: 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  his by scanning 
af00: 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74  through all stat
af10: 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61  4 samples, compa
af20: 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65  ring values.** e
af30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
af40: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
af50: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70  with the corresp
af60: 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e  onding column in
af70: 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e   each.** sample.
af80: 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20   If L and U are 
af90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
afa0: 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62  mples found to b
afb0: 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a  e less than or.*
afc0: 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76  * equal to the v
afd0: 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20  alues extracted 
afe0: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
aff0: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
b000: 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73  ely, and.** N is
b010: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
b020: 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68  r of samples, th
b030: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61  e pLoop->nOut va
b040: 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a  lue is adjusted.
b050: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
b060: 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f  *.**   nOut = nO
b070: 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c  ut * ( min(U - L
b080: 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a  , 1) / N ).**.**
b090: 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   If pLower is NU
b0a0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
b0b0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
b0c0: 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d  ed from the term
b0d0: 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  , L is.** set to
b0e0: 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72   zero. If pUpper
b0f0: 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76   is NULL, or a v
b100: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65  alue cannot be e
b110: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
b120: 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f  ,.** U is set to
b130: 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c   N..**.** Normal
b140: 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
b150: 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74  n sets *pbDone t
b160: 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72  o 1 before retur
b170: 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a  ning. However,.*
b180: 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61  * if no value ca
b190: 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  n be extracted f
b1a0: 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65  rom either pLowe
b1b0: 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64  r or pUpper (and
b1c0: 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d   so the.** estim
b1d0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
b1e0: 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65  r of rows delive
b1f0: 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  red remains unch
b200: 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a  anged), *pbDone.
b210: 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69 73  ** is left as is
b220: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
b230: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
b240: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
b250: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
b260: 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c  herwise, .** SQL
b270: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
b280: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
b290: 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50  SkipScanEst(.  P
b2a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b2b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
b2c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
b2d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
b2e0: 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
b2f0: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
b300: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
b310: 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
b320: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
b330: 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
b340: 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
b350: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
b360: 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
b370: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
b380: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
b390: 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ,    /* Update t
b3a0: 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f  he .nOut value o
b3b0: 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  f this loop */. 
b3c0: 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20   int *pbDone    
b3d0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
b3e0: 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74  true if at least
b3f0: 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65   one expr. value
b400: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b   extracted */.){
b410: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
b420: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
b430: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
b440: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
b450: 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nEq;.  sqlite3 *
b460: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b470: 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20  .  int nLower = 
b480: 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72  -1;.  int nUpper
b490: 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b   = p->nSample+1;
b4a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b4b0: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20  TE_OK;.  u8 aff 
b4c0: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f  = sqlite3IndexCo
b4d0: 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c  lumnAffinity(db,
b4e0: 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c   p, nEq);.  Coll
b4f0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20  Seq *pColl;.  . 
b500: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b510: 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p1 = 0;         
b520: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b530: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
b540: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b550: 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20  ue *p2 = 0;     
b560: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b570: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70  tracted from pUp
b580: 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  per */.  sqlite3
b590: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
b5a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
b5b0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b5c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43   record */..  pC
b5d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
b5e0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
b5f0: 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71  e, p->azColl[nEq
b600: 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  ]);.  if( pLower
b610: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b620: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
b630: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
b640: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
b650: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b  ight, aff, &p1);
b660: 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b  .    nLower = 0;
b670: 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65  .  }.  if( pUppe
b680: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
b690: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
b6a0: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
b6b0: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
b6c0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
b6d0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32  pRight, aff, &p2
b6e0: 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20  );.    nUpper = 
b6f0: 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d  p2 ? 0 : p->nSam
b700: 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ple;.  }..  if( 
b710: 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
b720: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
b730: 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Diff;.    for(i=
b740: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
b750: 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65   && i<p->nSample
b760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
b770: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43   = sqlite3Stat4C
b780: 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61  olumn(db, p->aSa
b790: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53  mple[i].p, p->aS
b7a0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c  ample[i].n, nEq,
b7b0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
b7c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b7d0: 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20   && p1 ){.      
b7e0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
b7f0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31  te3MemCompare(p1
b800: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
b810: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
b820: 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20  =0 ) nLower++;. 
b830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b840: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b850: 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  & p2 ){.        
b860: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
b870: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20  3MemCompare(p2, 
b880: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
b890: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
b8a0: 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20   ) nUpper++;.   
b8b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
b8c0: 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d  Diff = (nUpper -
b8d0: 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66   nLower);.    if
b8e0: 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69  ( nDiff<=0 ) nDi
b8f0: 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ff = 1;..    /* 
b900: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
b910: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
b920: 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66  wer bound specif
b930: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20  ied, and the .  
b940: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
b950: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
b960: 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hey are close to
b970: 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20  gether, use the 
b980: 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  fallback.    ** 
b990: 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74  method (assume t
b9a0: 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73  hat the scan vis
b9b0: 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20  its 1/64 of the 
b9c0: 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61  rows) for estima
b9d0: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
b9e0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
b9f0: 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73  isited. Otherwis
ba00: 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  e, estimate the 
ba10: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
ba20: 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20     ** using the 
ba30: 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
ba40: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63   in the header c
ba50: 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  omment for this 
ba60: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
ba70: 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c   if( nDiff!=1 ||
ba80: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c   pUpper==0 || pL
ba90: 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ower==0 ){.     
baa0: 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28   int nAdjust = (
bab0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d  sqlite3LogEst(p-
bac0: 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69  >nSample) - sqli
bad0: 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29  te3LogEst(nDiff)
bae0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  );.      pLoop->
baf0: 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b  nOut -= nAdjust;
bb00: 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d  .      *pbDone =
bb10: 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54   1;.      WHERET
bb20: 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
bb30: 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67  ge skip-scan reg
bb40: 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64  ions: %u..%u  ad
bb50: 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e  just=%d est=%d\n
bb60: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
bb80: 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41  ower, nUpper, nA
bb90: 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d  djust*-1, pLoop-
bba0: 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a  >nOut));.    }..
bbb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
bbc0: 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20  ert( *pbDone==0 
bbd0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
bbe0: 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a  3ValueFree(p1);.
bbf0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
bc00: 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p2);.  sqlite
bc10: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
bc20: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
bc30: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bc40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
bc50: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
bc60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
bc70: 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
bc80: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
bc90: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
bca0: 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
bcb0: 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
bcc0: 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
bcd0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
bce0: 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
bcf0: 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
bd00: 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
bd10: 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
bd20: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
bd30: 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
bd40: 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
bd50: 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
bd60: 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
bd70: 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
bd80: 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
bd90: 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
bda0: 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
bdb0: 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
bdc0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
bdd0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
bde0: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
be10: 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
be30: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
be60: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
be70: 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
be80: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
be90: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
bea0: 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
beb0: 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
bec0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
bed0: 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
bee0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
bef0: 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
bf00: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
bf10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
bf20: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
bf30: 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
bf40: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
bf50: 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
bf60: 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
bf70: 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
bf80: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
bf90: 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
bfa0: 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
bfb0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
bfc0: 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
bfd0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
bfe0: 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
bff0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
c000: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
c010: 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
c020: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
c030: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
c040: 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
c050: 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
c060: 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
c070: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
c080: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
c090: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
c0a0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
c0b0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
c0c0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
c0d0: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
c0e0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
c0f0: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
c100: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
c110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c120: 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
c130: 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
c140: 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
c150: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
c160: 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
c170: 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
c180: 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
c190: 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
c1a0: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
c1b0: 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
c1c0: 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e  q is 0, then *pn
c1d0: 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Out is the numbe
c1e0: 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
c1f0: 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
c200: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
c210: 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
c220: 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
c230: 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
c240: 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
c250: 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
c260: 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
c270: 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
c280: 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
c290: 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
c2a0: 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
c2b0: 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
c2c0: 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
c2d0: 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
c2e0: 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
c2f0: 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
c300: 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
c310: 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
c320: 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
c330: 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
c340: 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
c350: 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
c360: 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
c370: 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
c380: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
c390: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
c3a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c3b0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
c3c0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
c3d0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
c3e0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
c3f0: 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
c400: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
c410: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
c420: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
c430: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
c440: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
c450: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
c460: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
c470: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
c480: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
c490: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
c4a0: 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
c4b0: 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
c4c0: 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
c4d0: 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
c4e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c4f0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
c500: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
c510: 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
c520: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c530: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
c540: 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
c550: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
c560: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
c570: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
c580: 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
c590: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e  ->nSample>0 && n
c5a0: 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  Eq<p->nSampleCol
c5b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   ){.    if( nEq=
c5c0: 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
c5d0: 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e  alid ){.      Un
c5e0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
c5f0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
c600: 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  Rec;.      tRowc
c610: 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 69  nt a[2];.      i
c620: 6e 74 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d  nt nBtm = pLoop-
c630: 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20  >u.btree.nBtm;. 
c640: 20 20 20 20 20 69 6e 74 20 6e 54 6f 70 20 3d 20       int nTop = 
c650: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c660: 54 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56  Top;..      /* V
c670: 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77  ariable iLower w
c680: 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
c690: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
c6a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c6b0: 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   in .      ** th
c6c0: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
c6d0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
c6e0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
c6f0: 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54  e range query. T
c700: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65  he.      ** lowe
c710: 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
c720: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
c730: 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
c740: 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
c750: 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69      ** key-prefi
c760: 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  x formed by the 
c770: 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68  nEq values match
c780: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e  ed against the n
c790: 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20  Eq left-most.   
c7a0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66     ** columns of
c7b0: 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
c7c0: 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  $L is the value 
c7d0: 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20  in pLower..     
c7e0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c   **.      ** Or,
c7f0: 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   if pLower is NU
c800: 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20  LL or $L cannot 
c810: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
c820: 6d 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74  m it (because it
c830: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
c840: 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62   a simple variab
c850: 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61  le or literal va
c860: 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20  lue), the lower 
c870: 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  bound of the.   
c880: 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24     ** range is $
c890: 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72  P. Due to a quir
c8a0: 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65  k in the way whe
c8b0: 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72  reKeyStats() wor
c8c0: 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a  ks, even.      *
c8d0: 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c  * if $L is avail
c8e0: 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74  able, whereKeySt
c8f0: 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ats() is called 
c900: 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e  for both ($P) an
c910: 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a  d .      ** ($P:
c920: 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
c930: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
c940: 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73  turned values is
c950: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
c960: 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72        ** Similar
c970: 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f  ly, iUpper is to
c980: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
c990: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
c9a0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
c9b0: 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e      ** less than
c9c0: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c9d0: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75   of the range qu
c9e0: 65 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75  ery. Where the u
c9f0: 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20  pper bound.     
ca00: 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24   ** is either ($
ca10: 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41  P) or ($P:$U). A
ca20: 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55  gain, even if $U
ca30: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62   is available, b
ca40: 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20  oth values.     
ca50: 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72   ** of iUpper ar
ca60: 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77  e requested of w
ca70: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61  hereKeyStats() a
ca80: 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75  nd the smaller u
ca90: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sed..      **.  
caa0: 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65      ** The numbe
cab0: 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65  r of rows betwee
cac0: 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73  n the two bounds
cad0: 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55   is then just iU
cae0: 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20  pper-iLower..   
caf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77     */.      tRow
cb00: 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20  cnt iLower;     
cb10: 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61  /* Rows less tha
cb20: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
cb30: 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63  d */.      tRowc
cb40: 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f  nt iUpper;     /
cb50: 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
cb60: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
cb70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   */.      int iL
cb80: 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a  wrIdx = -2;   /*
cb90: 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
cba0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a  he lower bound *
cbb0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72  /.      int iUpr
cbc0: 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61  Idx = -1;   /* a
cbd0: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65  Sample[] for the
cbe0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
cbf0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20  .      if( pRec 
cc00: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
cc10: 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ase( pRec->nFiel
cc20: 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  d!=pBuilder->nRe
cc30: 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  cValid );.      
cc40: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
cc50: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
cc60: 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alid;.      }.  
cc70: 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
cc80: 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70   iLower and iUpp
cc90: 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e  er using ($P) on
cca0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
ccb0: 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20   nEq==0 ){.     
ccc0: 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
ccd0: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
cce0: 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20  p->nRowEst0;.   
ccf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cd00: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
cd10: 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70  call could be op
cd20: 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73  timized away - s
cd30: 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61  ince the same va
cd40: 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20  lues must .     
cd50: 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
cd60: 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74  requested when t
cd70: 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e  esting key $P in
cd80: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
cd90: 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  st().  */.      
cda0: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
cdb0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
cdc0: 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   0, a);.        
cdd0: 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
cde0: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
cdf0: 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20  a[0] + a[1];.   
ce00: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
ce10: 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c  rt( pLower==0 ||
ce20: 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
ce30: 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
ce40: 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  GE))!=0 );.     
ce50: 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
ce60: 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65  =0 || (pUpper->e
ce70: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
ce80: 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
ce90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cea0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
ceb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
cec0: 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29  SortOrder[nEq] )
ced0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
cee0: 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72   roles of pLower
cef0: 20 61 6e 64 20 70 55 70 70 65 72 20 61 72 65 20   and pUpper are 
cf00: 73 77 61 70 70 65 64 20 66 6f 72 20 61 20 44 45  swapped for a DE
cf10: 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  SC index */.    
cf20: 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
cf30: 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rm*, pLower, pUp
cf40: 70 65 72 29 3b 0a 20 20 20 20 20 20 20 20 53 57  per);.        SW
cf50: 41 50 28 69 6e 74 2c 20 6e 42 74 6d 2c 20 6e 54  AP(int, nBtm, nT
cf60: 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  op);.      }..  
cf70: 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
cf80: 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
cf90: 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61  he iLower estima
cfa0: 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29  te using ($P:$L)
cfb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
cfc0: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
cfd0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
cfe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
cff0: 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66  lues extracted f
d000: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
d010: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
d020: 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
d030: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
d040: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
d050: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
d060: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
d070: 63 2c 20 70 45 78 70 72 2c 20 6e 42 74 6d 2c 20  c, pExpr, nBtm, 
d080: 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  nEq, &n);.      
d090: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d0a0: 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20  _OK && n ){.    
d0b0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
d0c0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31  ew;.          u1
d0d0: 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57  6 mask = WO_GT|W
d0e0: 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20  O_LE;.          
d0f0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 56  if( sqlite3ExprV
d100: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
d110: 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f  >n ) mask = (WO_
d120: 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20  LE|WO_LT);.     
d130: 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77       iLwrIdx = w
d140: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
d150: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
d160: 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
d170: 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
d180: 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
d190: 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20   & mask) ? a[1] 
d1a0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
d1b0: 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20  if( iNew>iLower 
d1c0: 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b  ) iLower = iNew;
d1d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
d1e0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f  -;.          pLo
d1f0: 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wer = 0;.       
d200: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
d210: 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
d220: 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
d230: 20 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65   iUpper estimate
d240: 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20   using ($P:$U). 
d250: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70  */.      if( pUp
d260: 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  per ){.        i
d270: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
d280: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
d290: 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
d2a0: 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
d2b0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
d2c0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
d2d0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
d2e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
d2f0: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
d300: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
d310: 20 70 45 78 70 72 2c 20 6e 54 6f 70 2c 20 6e 45   pExpr, nTop, nE
d320: 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  q, &n);.        
d330: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d340: 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20  K && n ){.      
d350: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
d360: 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20  ;.          u16 
d370: 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  mask = WO_GT|WO_
d380: 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  LE;.          if
d390: 28 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  ( sqlite3ExprVec
d3a0: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e  torSize(pExpr)>n
d3b0: 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45   ) mask = (WO_LE
d3c0: 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20  |WO_LT);.       
d3d0: 20 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65     iUprIdx = whe
d3e0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
d3f0: 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
d410: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70  w = a[0] + ((pUp
d420: 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
d430: 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20   mask) ? a[1] : 
d440: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
d450: 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20  ( iNew<iUpper ) 
d460: 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iUpper = iNew;. 
d470: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
d480: 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65  .          pUppe
d490: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
d4a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d4b0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
d4c0: 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28   pRec;.      if(
d4d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d4e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55  {.        if( iU
d4f0: 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
d500: 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
d510: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
d520: 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
d530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
d540: 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55  ING:  If both iU
d550: 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20  pper and iLower 
d560: 61 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d  are derived from
d570: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
d580: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74      ** sample, t
d590: 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20  hen assume they 
d5a0: 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65  are 4x more sele
d5b0: 63 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69  ctive.  This bri
d5c0: 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ngs.          **
d5d0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73   the estimated s
d5e0: 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20  electivity more 
d5f0: 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61  in line with wha
d600: 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20  t it would be.  
d610: 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73          ** if es
d620: 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20  timated without 
d630: 74 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33  the use of STAT3
d640: 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  /4 tables. */.  
d650: 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72          if( iLwr
d660: 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e  Idx==iUprIdx ) n
d670: 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65  New -= 20;  asse
d680: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
d690: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
d6a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d6b0: 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
d6c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
d6d0: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
d6e0: 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (2) );.        }
d6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
d700: 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
d710: 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b      nOut = nNew;
d720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d730: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
d740: 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67  10, ("STAT4 rang
d750: 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20  e scan: %u..%u  
d760: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
d790: 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
d7a0: 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  nOut));.      }.
d7b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d7c0: 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
d7d0: 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
d7e0: 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
d7f0: 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c  (pParse, pLower,
d800: 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20   pUpper, pLoop, 
d810: 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  &bDone);.      i
d820: 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72  f( bDone ) retur
d830: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
d840: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
d850: 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
d860: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
d870: 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
d880: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
d890: 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65   || pUpper );.#e
d8a0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
d8b0: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
d8c0: 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  per->wtFlags & T
d8d0: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
d8e0: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
d8f0: 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65  angeAdjust(pLowe
d900: 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77  r, nOut);.  nNew
d910: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
d920: 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77  ust(pUpper, nNew
d930: 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  );..  /* TUNING:
d940: 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
d950: 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
d960: 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e  ower limit and n
d970: 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a  either limit.  *
d980: 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61  * has an applica
d990: 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b  tion-defined lik
d9a0: 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d  elihood(), assum
d9b0: 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
d9c0: 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
d9d0: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
d9e0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
d9f0: 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
da00: 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
da10: 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
da20: 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
da30: 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
da40: 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
da50: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
da60: 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
da70: 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
da80: 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
da90: 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
daa0: 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
dab0: 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
dac0: 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
dad0: 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72  er && pLower->tr
dae0: 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70  uthProb>0 && pUp
daf0: 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74  per && pUpper->t
db00: 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20  ruthProb>0 ){.  
db10: 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20    nNew -= 20;.  
db20: 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c  }..  nOut -= (pL
db30: 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70  ower!=0) + (pUpp
db40: 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e  er!=0);.  if( nN
db50: 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31  ew<10 ) nNew = 1
db60: 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f  0;.  if( nNew<nO
db70: 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77  ut ) nOut = nNew
db80: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
db90: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
dba0: 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  ).  if( pLoop->n
dbb0: 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  Out>nOut ){.    
dbc0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
dbd0: 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77  ("Range scan low
dbe0: 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64  ers nOut from %d
dbf0: 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
dc10: 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74  Loop->nOut, nOut
dc20: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
dc30: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
dc40: 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
dc50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
dc60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
dc70: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
dc80: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
dc90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
dca0: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
dcb0: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
dcc0: 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
dcd0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
dce0: 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
dcf0: 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
dd00: 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
dd10: 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
dd20: 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
dd30: 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
dd40: 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
dd50: 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
dd60: 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
dd70: 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
dd80: 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
dd90: 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
dda0: 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
ddb0: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
ddc0: 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
ddd0: 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
dde0: 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
ddf0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
de00: 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
de10: 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
de20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
de30: 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
de40: 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
de50: 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
de60: 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
de70: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
de80: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
de90: 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
dea0: 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
deb0: 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
dec0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
ded0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
dee0: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
def0: 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
df00: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
df10: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
df20: 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
df30: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
df40: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
df50: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
df60: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
df70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
df80: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
df90: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
dfa0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
dfb0: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
dfc0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
dfd0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
dfe0: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
dff0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
e000: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
e010: 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
e020: 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
e030: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
e040: 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
e050: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e060: 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
e070: 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
e080: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
e090: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
e0a0: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
e0b0: 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
e0c0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
e0d0: 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
e0e0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
e0f0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
e100: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e120: 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
e130: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
e140: 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
e150: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
e160: 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
e170: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
e180: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
e190: 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq<=p->nColumn
e1a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e1b0: 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
e1c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
e1d0: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
e1e0: 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
e1f0: 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20  cValid<nEq );.. 
e200: 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72   /* If values ar
e210: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
e220: 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  for all fields o
e230: 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74  f the index to t
e240: 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
e250: 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74  this one, no est
e260: 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64  imate can be mad
e270: 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
e280: 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20  _NOTFOUND. */.  
e290: 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  if( pBuilder->nR
e2a0: 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20  ecValid<(nEq-1) 
e2b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e2c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e2d0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73   }..  /* This is
e2e0: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
e2f0: 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20   only. The call 
e300: 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  to sqlite3Stat4P
e310: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20  robeSetValue(). 
e320: 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20   ** below would 
e330: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
e340: 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28  value.  */.  if(
e350: 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq>=p->nColumn
e360: 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
e370: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
e380: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
e390: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
e3a0: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
e3b0: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
e3c0: 2c 20 70 45 78 70 72 2c 20 31 2c 20 6e 45 71 2d  , pExpr, 1, nEq-
e3d0: 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69  1, &bOk);.  pBui
e3e0: 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
e3f0: 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
e400: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
e410: 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30  rc;.  if( bOk==0
e420: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e430: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75  _NOTFOUND;.  pBu
e440: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
e450: 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65   = nEq;..  where
e460: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
e470: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
e480: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
e490: 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  10,("equality sc
e4a0: 61 6e 20 72 65 67 69 6f 6e 73 20 25 73 28 25 64  an regions %s(%d
e4b0: 29 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ): %d\n",.      
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
e4d0: 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c 20 28 69  zName, nEq-1, (i
e4e0: 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e  nt)a[1]));.  *pn
e4f0: 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20  Row = a[1];.  . 
e500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
e510: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
e520: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
e530: 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TAT4 */..#ifdef 
e540: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e550: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
e560: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
e570: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
e580: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
e590: 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
e5a0: 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
e5b0: 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
e5c0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
e5d0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
e5e0: 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
e5f0: 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
e600: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
e610: 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
e620: 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
e630: 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
e640: 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
e650: 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
e660: 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
e670: 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
e680: 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
e690: 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
e6a0: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
e6b0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
e6c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
e6d0: 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
e6e0: 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
e6f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e700: 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
e710: 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
e720: 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
e730: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
e740: 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
e750: 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
e760: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
e770: 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
e780: 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
e790: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
e7a0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
e7b0: 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
e7c0: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
e7d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
e7e0: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
e7f0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
e800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
e810: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
e820: 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  er,.  ExprList *
e830: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
e840: 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
e850: 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
e860: 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
e870: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
e880: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
e890: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
e8a0: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
e8b0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
e8c0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
e8d0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
e8e0: 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30  dex;.  i64 nRow0
e8f0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
e900: 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f  ToInt(p->aiRowLo
e910: 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  gEst[0]);.  int 
e920: 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
e930: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
e940: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e950: 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75  TE_OK;     /* Su
e960: 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
e970: 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
e980: 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20  nt nEst;        
e990: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e9a0: 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
e9b0: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77  e term */.  tRow
e9c0: 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b  cnt nRowEst = 0;
e9d0: 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d      /* New estim
e9e0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
e9f0: 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
ea00: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
ea10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ea20: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
ea30: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
ea40: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
ea50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ea60: 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
ea70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74  ; i++){.    nEst
ea80: 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63   = nRow0;.    rc
ea90: 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
eaa0: 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
eab0: 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b  ilder, pList->a[
eac0: 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29  i].pExpr, &nEst)
ead0: 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d  ;.    nRowEst +=
eae0: 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c   nEst;.    pBuil
eaf0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
eb00: 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a   nRecValid;.  }.
eb10: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
eb20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
eb30: 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20  nRowEst > nRow0 
eb40: 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77  ) nRowEst = nRow
eb50: 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  0;.    *pnRow = 
eb60: 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45  nRowEst;.    WHE
eb70: 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49  RETRACE(0x10,("I
eb80: 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20  N row estimate: 
eb90: 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45  est=%d\n", nRowE
eba0: 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  st));.  }.  asse
ebb0: 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
ebc0: 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c  ecValid==nRecVal
ebd0: 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  id );.  return r
ebe0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
ebf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
ec00: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
ec10: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
ec20: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
ec30: 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65   Print the conte
ec40: 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54 65 72  nt of a WhereTer
ec50: 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  m object.*/.stat
ec60: 69 63 20 76 6f 69 64 20 77 68 65 72 65 54 65 72  ic void whereTer
ec70: 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65 72 6d  mPrint(WhereTerm
ec80: 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54 65   *pTerm, int iTe
ec90: 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
eca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ecb0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 54  e3DebugPrintf("T
ecc0: 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22  ERM-%-3d NULL\n"
ecd0: 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , iTerm);.  }els
ece0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79 70  e{.    char zTyp
ecf0: 65 5b 34 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a  e[4];.    char z
ed00: 4c 65 66 74 5b 35 30 5d 3b 0a 20 20 20 20 6d 65  Left[50];.    me
ed10: 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e  mcpy(zType, "...
ed20: 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70  ", 4);.    if( p
ed30: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
ed40: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a  TERM_VIRTUAL ) z
ed50: 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20  Type[0] = 'V';. 
ed60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ed70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
ed80: 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d  IV  ) zType[1] =
ed90: 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78   'E';.    if( Ex
eda0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
edb0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
edc0: 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65  romJoin) ) zType
edd0: 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 69  [2] = 'L';.    i
ede0: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
edf0: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 20  tor & WO_SINGLE 
ee00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ee10: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
ee20: 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c  (zLeft),zLeft,"l
ee30: 65 66 74 3d 7b 25 64 3a 25 64 7d 22 2c 0a 20 20  eft={%d:%d}",.  
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
ee60: 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 75  Cursor, pTerm->u
ee70: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20  .leftColumn);.  
ee80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
ee90: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
eea0: 57 4f 5f 4f 52 29 21 3d 30 20 26 26 20 70 54 65  WO_OR)!=0 && pTe
eeb0: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 21 3d 30  rm->u.pOrInfo!=0
eec0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eed0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
eee0: 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22  f(zLeft),zLeft,"
eef0: 69 6e 64 65 78 61 62 6c 65 3d 30 78 25 6c 6c 64  indexable=0x%lld
ef00: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
ef10: 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d             pTerm
ef20: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
ef30: 65 78 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c  exable);.    }el
ef40: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
ef50: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
ef60: 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22  f(zLeft),zLeft,"
ef70: 6c 65 66 74 3d 25 64 22 2c 20 70 54 65 72 6d 2d  left=%d", pTerm-
ef80: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
ef90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
efa0: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
efb0: 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70     "TERM-%-3d %p
efc0: 20 25 73 20 25 2d 31 32 73 20 70 72 6f 62 3d 25   %s %-12s prob=%
efd0: 2d 33 64 20 6f 70 3d 30 78 25 30 33 78 20 77 74  -3d op=0x%03x wt
efe0: 46 6c 61 67 73 3d 30 78 25 30 34 78 22 2c 0a 20  Flags=0x%04x",. 
eff0: 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65        iTerm, pTe
f000: 72 6d 2c 20 7a 54 79 70 65 2c 20 7a 4c 65 66 74  rm, zType, zLeft
f010: 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  , pTerm->truthPr
f020: 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65 72 6d  ob,.       pTerm
f030: 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70 54 65  ->eOperator, pTe
f040: 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20 20  rm->wtFlags);.  
f050: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 46 69    if( pTerm->iFi
f060: 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eld ){.      sql
f070: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f080: 22 20 69 46 69 65 6c 64 3d 25 64 5c 6e 22 2c 20  " iField=%d\n", 
f090: 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a  pTerm->iField);.
f0a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f0b0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
f0c0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
f0d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
f0e0: 56 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72  ViewExpr(0, pTer
f0f0: 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  m->pExpr, 0);.  
f100: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
f110: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
f120: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77  ABLED./*.** Show
f130: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
f140: 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65  ntent of a Where
f150: 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69 64 20 73  Clause.*/.void s
f160: 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
f170: 65 50 72 69 6e 74 28 57 68 65 72 65 43 6c 61 75  ePrint(WhereClau
f180: 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20  se *pWC){.  int 
f190: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
f1a0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
f1b0: 7b 0a 20 20 20 20 77 68 65 72 65 54 65 72 6d 50  {.    whereTermP
f1c0: 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b 69 5d 2c  rint(&pWC->a[i],
f1d0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   i);.  }.}.#endi
f1e0: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
f1f0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
f200: 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
f210: 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
f220: 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
f230: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
f240: 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
f250: 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
f260: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
f270: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
f280: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
f290: 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
f2a0: 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
f2b0: 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a  ist->nSrc+3)/4;.
f2c0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
f2d0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
f2e0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
f2f0: 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
f300: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
f310: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 42 69 74  tem->pTab;.  Bit
f320: 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28 28 28 42  mask mAll = (((B
f330: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e 62 2a 34  itmask)1)<<(nb*4
f340: 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65  )) - 1;.  sqlite
f350: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63  3DebugPrintf("%c
f360: 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
f370: 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
f3a0: 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
f3b0: 2d 3e 70 72 65 72 65 71 20 26 20 6d 41 6c 6c 29  ->prereq & mAll)
f3c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
f3d0: 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a  Printf(" %12s",.
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69       pItem->zAli
f400: 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  as ? pItem->zAli
f410: 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  as : pTab->zName
f420: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
f430: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
f440: 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
f450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f460: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  *zName;.    if( 
f470: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
f480: 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d  x && (zName = p-
f490: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f4a0: 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
f4b0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
f4c0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
f4d0: 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
f4e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
f4f0: 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
f500: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
f510: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
f520: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
f530: 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
f540: 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
f550: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
f560: 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
f570: 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
f580: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
f590: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f5a0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f5b0: 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
f5c0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
f5d0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
f5e0: 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
f5f0: 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
f600: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f610: 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
f620: 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
f630: 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
f640: 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
f650: 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
f660: 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
f670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
f680: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f690: 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
f6a0: 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
f6b0: 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
f6c0: 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
f6d0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f6e0: 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
f6f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f700: 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (z);.  }.  if( p
f710: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f720: 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20  E_SKIPSCAN ){.  
f730: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f740: 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 25 64  intf(" f %05x %d
f750: 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73  -%d", p->wsFlags
f760: 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e  , p->nLTerm,p->n
f770: 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Skip);.  }else{.
f780: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f790: 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20  Printf(" f %05x 
f7a0: 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67  N %d", p->wsFlag
f7b0: 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20  s, p->nLTerm);. 
f7c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
f7d0: 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25  gPrintf(" cost %
f7e0: 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72  d,%d,%d\n", p->r
f7f0: 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20  Setup, p->rRun, 
f800: 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20  p->nOut);.  if( 
f810: 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71  p->nLTerm && (sq
f820: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
f830: 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20  & 0x100)!=0 ){. 
f840: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
f850: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65  r(i=0; i<p->nLTe
f860: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
f870: 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70  whereTermPrint(p
f880: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b  ->aLTerm[i], i);
f890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
f8a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
f8b0: 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69  rt bulk memory i
f8c0: 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72  nto a valid Wher
f8d0: 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62  eLoop that can b
f8e0: 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77  e passed.** to w
f8f0: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61  hereLoopClear ha
f900: 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61  rmlessly..*/.sta
f910: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f920: 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70  opInit(WhereLoop
f930: 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72   *p){.  p->aLTer
f940: 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61  m = p->aLTermSpa
f950: 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20  ce;.  p->nLTerm 
f960: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  = 0;.  p->nLSlot
f970: 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   = ArraySize(p->
f980: 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20  aLTermSpace);.  
f990: 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
f9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
f9b0: 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75  he WhereLoop.u u
f9c0: 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65  nion.  Leave Whe
f9d0: 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e  reLoop.pLTerm in
f9e0: 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tact..*/.static 
f9f0: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
fa00: 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33  earUnion(sqlite3
fa10: 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
fa20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73  *p){.  if( p->ws
fa30: 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56  Flags & (WHERE_V
fa40: 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52  IRTUALTABLE|WHER
fa50: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b  E_AUTO_INDEX) ){
fa60: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
fa70: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
fa80: 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26  TUALTABLE)!=0 &&
fa90: 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
faa0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ree ){.      sql
fab0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76  ite3_free(p->u.v
fac0: 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
fad0: 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65     p->u.vtab.nee
fae0: 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
faf0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
fb00: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 0;.    }else
fb10: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
fb20: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
fb30: 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  DEX)!=0 && p->u.
fb40: 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
fb50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fb60: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
fb70: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43  btree.pIndex->zC
fb80: 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71  olAff);.      sq
fb90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
fba0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
fbb0: 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62  x);.      p->u.b
fbc0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
fbd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
fbe0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69  .** Deallocate i
fbf0: 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75  nternal memory u
fc00: 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f  sed by a WhereLo
fc10: 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
fc20: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
fc30: 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  opClear(sqlite3 
fc40: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
fc50: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  p){.  if( p->aLT
fc60: 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
fc70: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
fc80: 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
fc90: 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
fca0: 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
fcb0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
fcc0: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
fcd0: 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
fce0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
fcf0: 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
fd00: 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
fd10: 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
fd20: 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
fd30: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
fd40: 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
fd50: 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
fd60: 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
fd70: 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
fd80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fd90: 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
fda0: 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
fdb0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
fdc0: 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
fdd0: 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
fde0: 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
fdf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
fe00: 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
fe10: 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
fe20: 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
fe30: 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
fe40: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
fe50: 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
fe60: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
fe70: 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
fe80: 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
fe90: 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
fea0: 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
feb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fec0: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
fed0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
fee0: 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
fef0: 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
ff00: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
ff10: 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
ff20: 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
ff30: 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
ff40: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
ff50: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
ff60: 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
ff70: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
ff80: 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
ff90: 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
ffa0: 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
ffb0: 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
ffc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ffd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
ffe0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54  .  }.  memcpy(pT
fff0: 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f  o, pFrom, WHERE_
10000 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20  LOOP_XFER_SZ);. 
10010 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54   memcpy(pTo->aLT
10020 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65  erm, pFrom->aLTe
10030 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a  rm, pTo->nLTerm*
10040 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65  sizeof(pTo->aLTe
10050 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  rm[0]));.  if( p
10060 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20  From->wsFlags & 
10070 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
10080 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  LE ){.    pFrom-
10090 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
100a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
100b0 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67  ( (pFrom->wsFlag
100c0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
100d0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
100e0 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70  pFrom->u.btree.p
100f0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Index = 0;.  }. 
10100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10110 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  K;.}../*.** Dele
10120 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  te a WhereLoop o
10130 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
10140 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65  void whereLoopDe
10150 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
10160 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
10170 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
10180 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69  r(db, p);.  sqli
10190 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
101a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
101b0 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
101c0 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
101d0 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
101e0 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
101f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
10200 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
10210 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
10220 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
10230 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
10240 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
10250 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
10260 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
10270 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
10280 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26  pLevel->pWLoop &
10290 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  & (pLevel->pWLoo
102a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
102b0 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20  RE_IN_ABLE) ){. 
102c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
102d0 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
102e0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
102f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10300 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
10310 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
10320 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
10330 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
10340 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
10350 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
10360 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
10370 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
10380 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
10390 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
103a0 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
103b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
103c0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
103d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
103e0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
103f0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
10400 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
10410 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73  .**   (1)  X has
10420 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
10430 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a  er cost that Y.*
10440 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20  *   (2)  X is a 
10450 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
10460 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73   Y.**   (3)  X s
10470 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73  kips at least as
10480 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73   many columns as
10490 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f   Y.**.** By "pro
104a0 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d  per subset" we m
104b0 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20  ean that X uses 
104c0 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75  fewer WHERE clau
104d0 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e  se terms.** than
104e0 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
104f0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
10500 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
10510 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79   also used.** by
10520 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69   Y..**.** If X i
10530 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10540 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73  t of Y then Y is
10550 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65   a better choice
10560 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f   and ought.** to
10570 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f   have a lower co
10580 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  st.  This routin
10590 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77  e returns TRUE w
105a0 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a  hen that cost .*
105b0 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69  * relationship i
105c0 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e  s inverted and n
105d0 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73  eeds to be adjus
105e0 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20  ted.  The third 
105f0 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65  rule.** was adde
10600 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75  d because if X u
10610 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65  ses skip-scan le
10620 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69  ss than Y it sti
10630 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65  ll might.** dese
10640 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  rve a lower cost
10650 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61   even if it is a
10660 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
10670 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f Y..*/.static i
10680 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  nt whereLoopChea
10690 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
106a0 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
106b0 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a  op *pX,       /*
106c0 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70   First WhereLoop
106d0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
106e0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
106f0 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43   *pY        /* C
10700 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74  ompare against t
10710 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  his WhereLoop */
10720 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
10730 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d    if( pX->nLTerm
10740 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59  -pX->nSkip >= pY
10750 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b  ->nLTerm-pY->nSk
10760 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ip ){.    return
10770 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20   0; /* X is not 
10780 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f  a subset of Y */
10790 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e  .  }.  if( pY->n
107a0 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70  Skip > pX->nSkip
107b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
107c0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70  f( pX->rRun >= p
107d0 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69  Y->rRun ){.    i
107e0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59  f( pX->rRun > pY
107f0 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20  ->rRun ) return 
10800 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
10810 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
10820 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74      if( pX->nOut
10830 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65   > pY->nOut ) re
10840 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
10850 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
10860 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Y */.  }.  for(i
10870 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  =pX->nLTerm-1; i
10880 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
10890 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  f( pX->aLTerm[i]
108a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
108b0 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
108c0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
108d0 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
108e0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
108f0 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
10900 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10910 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
10920 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
10930 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
10940 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
10950 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
10960 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
10970 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
10980 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
10990 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
109a0 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
109b0 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
109c0 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
109d0 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
109e0 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
109f0 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
10a00 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
10a10 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
10a20 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
10a30 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
10a40 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
10a50 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
10a60 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
10a70 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
10a80 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
10a90 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
10aa0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10ab0 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
10ac0 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
10ad0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10ae0 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
10af0 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
10b00 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
10b10 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
10b20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
10b30 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
10b40 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
10b50 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a  o used by Y..*/.
10b60 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10b70 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
10b80 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
10b90 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  *p, WhereLoop *p
10ba0 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28  Template){.  if(
10bb0 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
10bc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
10bd0 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72  EXED)==0 ) retur
10be0 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
10bf0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
10c00 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
10c10 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
10c20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10c30 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
10c40 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
10c50 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
10c60 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
10c70 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
10c80 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74  bset(p, pTemplat
10c90 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  e) ){.      /* A
10ca0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
10cb0 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f  cost downward so
10cc0 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61   that it is chea
10cd0 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20  per than its .  
10ce0 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e      ** subset p.
10cf0 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
10d00 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
10d10 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
10d20 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
10d30 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
10d50 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
10d60 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
10d70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d  ->rRun, p->nOut-
10d80 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
10d90 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
10da0 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
10db0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
10dc0 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d  >nOut - 1;.    }
10dd0 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f  else if( whereLo
10de0 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
10df0 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c  ubset(pTemplate,
10e00 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   p) ){.      /* 
10e10 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
10e20 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20   cost upward so 
10e30 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c  that it is costl
10e40 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65  ier than p since
10e50 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c  .      ** pTempl
10e60 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20  ate is a proper 
10e70 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20  subset of p */. 
10e80 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10e90 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
10ea0 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
10eb0 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
10ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ed0 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
10ee0 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
10ef0 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
10f00 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a  n, p->nOut+1));.
10f10 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10f20 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
10f30 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
10f40 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
10f50 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
10f60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
10f70 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
10f80 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
10f90 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
10fa0 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
10fb0 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70   supplanted by p
10fc0 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
10fd0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
10fe0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73  he WhereLoop lis
10ff0 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  t contains an en
11000 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70  try that can sup
11010 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61  plant.** pTempla
11020 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  te, in other wor
11030 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  ds if pTemplate 
11040 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
11050 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  on the list..**.
11060 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
11070 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
11080 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c  mplate can suppl
11090 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ant, then return
110a0 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61   the.** link tha
110b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a  t points to pX..
110c0 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61  **.** If pTempla
110d0 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61  te cannot suppla
110e0 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  nt any existing 
110f0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
11100 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
11110 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
11120 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72  the list, then r
11130 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
11140 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  to the tail of t
11150 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
11160 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
11170 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
11180 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
11190 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
111a0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
111b0 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
111c0 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
111d0 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
111e0 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
111f0 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
11200 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
11210 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
11220 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
11230 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
11240 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
11250 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
11260 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
11270 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
11280 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
11290 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
112a0 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
112b0 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
112c0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
112d0 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
112e0 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
112f0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
11300 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
11310 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
11320 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
11330 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
11340 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
11350 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
11360 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
11370 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
11380 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
11390 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
113a0 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
113b0 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
113c0 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
113d0 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
113e0 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
113f0 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
11400 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
11410 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
11420 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
11430 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
11440 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
11450 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
11460 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
11470 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
11480 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
11490 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
114a0 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
114b0 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
114c0 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
114d0 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
114e0 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
114f0 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
11500 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
11510 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
11520 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
11530 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11540 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f  ;..    /* Any lo
11550 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c  op using an appl
11560 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69  iation-defined i
11570 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59  ndex (or PRIMARY
11580 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55   KEY or.    ** U
11590 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
115a0 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f  ) with one or mo
115b0 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  re == constraint
115c0 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  s is better.    
115d0 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d  ** than an autom
115e0 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65  atic index. Unle
115f0 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d  ss it is a skip-
11600 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
11610 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
11620 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
11630 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
11640 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d  mplate->nSkip)==
11650 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
11660 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
11670 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
11680 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
11690 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
116a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
116b0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  !=0.     && (p->
116c0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
116d0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
116e0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
116f0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
11700 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
11710 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
11720 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
11730 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
11740 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
11750 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
11760 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
11770 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
11780 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
11790 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
117a0 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
117b0 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
117c0 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
117d0 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
117e0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
117f0 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
11800 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
11810 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
11820 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
11830 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
11840 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
11850 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
11860 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
11870 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
11880 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
11890 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
118a0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
118b0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
118c0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
118d0 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
118e0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
118f0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
11900 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
11910 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
11920 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
11930 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
11940 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
11950 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
11960 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
11970 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
11980 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
11990 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
119a0 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
119b0 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
119c0 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
119d0 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
119e0 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
119f0 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
11a00 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
11a10 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
11a20 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11a30 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
11a40 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
11a50 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11a60 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
11a70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
11a80 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
11a90 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
11aa0 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
11ad0 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
11ae0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
11b10 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
11b20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11b30 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
11b40 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
11b50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
11b60 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
11b70 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
11b80 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
11b90 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
11ba0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11bb0 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
11bc0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
11bd0 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
11be0 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
11bf0 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
11c00 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
11c10 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
11c20 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
11c30 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
11c40 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
11c50 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
11c60 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
11c70 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
11c80 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
11c90 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
11ca0 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
11cb0 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
11cc0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
11cd0 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
11ce0 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
11cf0 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
11d00 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
11d10 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
11d20 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
11d30 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
11d40 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
11d50 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11d60 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
11d70 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
11d80 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
11d90 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
11da0 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
11db0 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
11dc0 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
11dd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
11de0 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
11df0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11e00 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
11e10 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
11e20 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
11e30 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
11e40 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
11e50 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
11e60 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
11e70 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
11e80 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
11e90 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
11ea0 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
11eb0 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
11ec0 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
11ed0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
11ee0 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
11ef0 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
11f00 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
11f10 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
11f20 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
11f30 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
11f40 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
11f50 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
11f60 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
11f70 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
11f80 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
11f90 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
11fa0 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
11fb0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
11fc0 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
11fd0 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
11fe0 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
11ff0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
12000 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
12010 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
12020 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
12030 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
12040 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
12050 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
12060 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
12070 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
12080 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
12090 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
120a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
120b0 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
120c0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
120d0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
120e0 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  c;..  /* If pBui
120f0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
12100 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
12110 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
12120 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
12130 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
12140 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
12150 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
12160 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
12170 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
12180 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12190 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
121a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
121b0 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
121c0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
121d0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
121e0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
121f0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
12200 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
12210 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
12240 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
12250 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12260 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
12270 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12280 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
12290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
122a0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
122b0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
122c0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
122d0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
122e0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
122f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
12300 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
12310 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
12330 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
12340 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
12350 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
12360 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
12370 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
12380 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
12390 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
123a0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
123b0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
123c0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
123d0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
123e0 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
123f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
12400 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
12410 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
12420 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
12430 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
12440 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
12450 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
12460 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
12470 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12480 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
12490 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
124a0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
124b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
124c0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
124d0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
124e0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
124f0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
12500 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
12510 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
12520 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
12530 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
12540 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
12550 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
12560 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
12570 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
12580 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
12590 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
125a0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
125b0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
125c0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
125d0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
125e0 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
125f0 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
12600 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
12610 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
12620 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12630 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
12640 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
12650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12660 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
12670 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
12680 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
12690 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
126a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
126b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
126c0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
126d0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
126e0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
126f0 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
12700 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
12710 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
12720 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
12730 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
12740 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
12750 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
12760 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
12770 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
12780 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
12790 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
127a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
127b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77  OMEM_BKPT;.    w
127c0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
127d0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
127e0 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
127f0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
12800 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
12810 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
12820 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
12830 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
12840 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
12850 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
12860 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
12870 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
12880 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
12890 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
128a0 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
128b0 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
128c0 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
128d0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
128e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
128f0 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
12900 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
12910 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
12920 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
12930 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
12940 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
12950 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
12960 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
12970 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
12980 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
12990 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
129a0 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
129b0 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
129c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
129d0 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
129e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
129f0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
12a00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12a10 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
12a20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
12a30 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
12a40 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
12a50 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
12a60 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
12a70 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
12a80 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
12a90 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
12aa0 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
12ab0 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70  plate);.  if( (p
12ac0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
12ad0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
12ae0 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
12af0 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
12b00 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
12b10 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
12b20 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
12b30 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
12b40 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
12b50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12b60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
12b70 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
12b80 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
12b90 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
12ba0 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
12bb0 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
12bc0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
12bd0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
12be0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
12bf0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
12c00 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
12c10 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
12c20 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
12c30 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
12c40 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
12c50 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
12c60 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
12c70 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
12c80 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
12c90 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
12ca0 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
12cb0 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
12cc0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
12cd0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
12ce0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
12cf0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
12d00 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
12d10 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
12d20 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
12d30 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
12d40 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
12d50 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
12d60 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
12d70 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
12d80 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
12d90 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
12da0 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
12db0 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
12dc0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12dd0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
12de0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
12df0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
12e00 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
12e10 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
12e20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
12e30 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
12e40 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
12e50 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12e60 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
12e70 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
12e80 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
12e90 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
12ea0 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
12eb0 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
12ec0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
12ed0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
12ee0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
12ef0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
12f00 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
12f10 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
12f20 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
12f30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12f40 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
12f50 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
12f60 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
12f70 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
12f80 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
12f90 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
12fa0 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
12fb0 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
12fc0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
12fd0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
12fe0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
12ff0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
13000 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
13010 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
13020 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
13030 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
13040 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
13050 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
13060 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
13070 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
13080 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
13090 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
130a0 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
130b0 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
130c0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
130d0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
130e0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
130f0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
13100 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
13110 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
13120 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
13130 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
13140 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13150 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
13160 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
13170 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
13180 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
13190 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
131a0 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
131b0 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
131c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
131d0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
131e0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
131f0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13200 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
13210 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
13220 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
13230 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
13240 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
13250 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
13260 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
13270 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
13280 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
13290 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
132a0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
132b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
132c0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
132d0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
132e0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
132f0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
13300 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
13310 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13320 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
13330 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
13340 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13350 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
13360 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
13370 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
13380 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
13390 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
133a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
133b0 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
133c0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
133d0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
133e0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
133f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
13400 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13410 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
13420 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
13430 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
13440 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
13450 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
13460 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13470 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
13480 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
13490 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
134a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
134b0 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
134c0 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
134d0 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
134e0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
134f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
13500 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
13510 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
13520 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
13530 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
13540 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
13550 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
13560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13570 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
13580 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
13590 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
135a0 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
135b0 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
135c0 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
135d0 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
135e0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
135f0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
13600 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
13610 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
13620 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
13630 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
13640 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
13650 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
13660 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13670 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
13680 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
13690 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
136a0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
136b0 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
136c0 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
136d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
136e0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
136f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13700 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
13710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13720 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
13730 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
13740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13760 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
13770 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
13780 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
13790 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
137a0 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65  ./* .** Term pTe
137b0 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20 72  rm is a vector r
137c0 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ange comparison 
137d0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66  operation. The f
137e0 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  irst comparison.
137f0 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ** in the vector
13800 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
13810 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  d using column n
13820 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  Eq of the index.
13830 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
13840 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
13850 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65  tal number of ve
13860 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68  ctor elements th
13870 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
13880 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
13890 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
138a0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  n..**.** For exa
138b0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
138c0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57  ry is:.**.**   W
138d0 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28  HERE a = ? AND (
138e0 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f  b, c, d) > (?, ?
138f0 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74  , ?).**.** and t
13900 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20  he index:.**.** 
13910 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e    CREATE INDEX .
13920 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20  .. ON (a, b, c, 
13930 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  d, e).**.** then
13940 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
13950 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
13960 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20  with nEq=1. The 
13970 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
13980 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69  n.** this case i
13990 73 20 33 2e 0a 2a 2f 0a 69 6e 74 20 77 68 65 72  s 3..*/.int wher
139a0 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
139b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
139c0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
139d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
139e0 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
139f0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
13a00 70 65 6e 20 6f 6e 20 70 49 64 78 20 2a 2f 0a 20  pen on pIdx */. 
13a10 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
13a20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
13a30 65 78 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ex to be used fo
13a40 72 20 61 20 69 6e 65 71 75 61 6c 69 74 79 20 63  r a inequality c
13a50 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69  onstraint */.  i
13a60 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20  nt nEq,         
13a70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13a80 20 70 72 69 6f 72 20 65 71 75 61 6c 69 74 79 20   prior equality 
13a90 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 73  constraints on s
13aa0 61 6d 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ame index */.  W
13ab0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
13ac0 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f      /* The vecto
13ad0 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  r inequality con
13ae0 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
13af0 69 6e 74 20 6e 43 6d 70 20 3d 20 73 71 6c 69 74  int nCmp = sqlit
13b00 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
13b10 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
13b20 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
13b30 0a 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 43  .  nCmp = MIN(nC
13b40 6d 70 2c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75  mp, (pIdx->nColu
13b50 6d 6e 20 2d 20 6e 45 71 29 29 3b 0a 20 20 66 6f  mn - nEq));.  fo
13b60 72 28 69 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=1; i<nCmp; i
13b70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 65 73 74  ++){.    /* Test
13b80 20 69 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   if comparison i
13b90 20 6f 66 20 70 54 65 72 6d 20 69 73 20 63 6f 6d   of pTerm is com
13ba0 70 61 74 69 62 6c 65 20 77 69 74 68 20 63 6f 6c  patible with col
13bb0 75 6d 6e 20 28 69 2b 6e 45 71 29 20 0a 20 20 20  umn (i+nEq) .   
13bc0 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
13bd0 2e 20 49 66 20 6e 6f 74 2c 20 65 78 69 74 20 74  . If not, exit t
13be0 68 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20  he loop.  */.   
13bf0 20 63 68 61 72 20 61 66 66 3b 20 20 20 20 20 20   char aff;      
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13c10 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66  * Comparison aff
13c20 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 63 68 61  inity */.    cha
13c30 72 20 69 64 78 61 66 66 20 3d 20 30 3b 20 20 20  r idxaff = 0;   
13c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13c50 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 66  dexed columns af
13c60 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43 6f  finity */.    Co
13c70 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
13c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13c90 6f 6d 70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61 74  omparison collat
13ca0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
13cb0 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
13cc0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
13cd0 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Left->x.pList->a
13ce0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
13cf0 78 70 72 20 2a 70 52 68 73 20 3d 20 70 54 65 72  xpr *pRhs = pTer
13d00 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
13d10 3b 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  ;.    if( pRhs->
13d20 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
13d30 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70 52  lect ){.      pR
13d40 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70 53 65  hs = pRhs->x.pSe
13d50 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
13d60 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  i].pExpr;.    }e
13d70 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 68 73 20  lse{.      pRhs 
13d80 3d 20 70 52 68 73 2d 3e 78 2e 70 4c 69 73 74 2d  = pRhs->x.pList-
13d90 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
13da0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
13db0 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 6f 66   that the LHS of
13dc0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
13dd0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
13de0 72 65 6e 63 65 20 74 6f 0a 20 20 20 20 2a 2a 20  rence to.    ** 
13df0 74 68 65 20 72 69 67 68 74 20 63 6f 6c 75 6d 6e  the right column
13e00 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 73 6f   of the right so
13e10 75 72 63 65 20 74 61 62 6c 65 2e 20 41 6e 64 20  urce table. And 
13e20 74 68 61 74 20 74 68 65 20 73 6f 72 74 0a 20 20  that the sort.  
13e30 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68    ** order of th
13e40 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69  e index column i
13e50 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
13e60 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  e sort order of 
13e70 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 6d  the.    ** leftm
13e80 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  ost index column
13e90 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  .  */.    if( pL
13ea0 68 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  hs->op!=TK_COLUM
13eb0 4e 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d  N .     || pLhs-
13ec0 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 0a 20  >iTable!=iCur . 
13ed0 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f      || pLhs->iCo
13ee0 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn!=pIdx->aiCo
13ef0 6c 75 6d 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20 20  lumn[i+nEq] .   
13f00 20 20 7c 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74    || pIdx->aSort
13f10 4f 72 64 65 72 5b 69 2b 6e 45 71 5d 21 3d 70 49  Order[i+nEq]!=pI
13f20 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
13f30 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
13f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
13f50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 68     testcase( pLh
13f60 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52  s->iColumn==XN_R
13f70 4f 57 49 44 20 29 3b 0a 20 20 20 20 61 66 66 20  OWID );.    aff 
13f80 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
13f90 41 66 66 69 6e 69 74 79 28 70 52 68 73 2c 20 73  Affinity(pRhs, s
13fa0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
13fb0 74 79 28 70 4c 68 73 29 29 3b 0a 20 20 20 20 69  ty(pLhs));.    i
13fc0 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
13fd0 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
13fe0 74 79 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c  ty(pIdx->pTable,
13ff0 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b   pLhs->iColumn);
14000 0a 20 20 20 20 69 66 28 20 61 66 66 21 3d 69 64  .    if( aff!=id
14010 78 61 66 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20  xaff ) break;.. 
14020 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
14030 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
14040 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14050 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
14060 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 62  if( pColl==0 ) b
14070 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
14080 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
14090 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
140a0 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20  >azColl[i+nEq]) 
140b0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
140c0 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
140d0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
140e0 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
140f0 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
14100 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
14110 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
14120 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
14130 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
14140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14150 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
14160 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
14170 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
14180 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
14190 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
141a0 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
141b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
141c0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
141d0 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
141e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
141f0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
14200 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
14210 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
14220 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
14230 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
14240 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
14250 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
14260 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
14270 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
14280 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
14290 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
142a0 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
142b0 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
142c0 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
142d0 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
142e0 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
142f0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
14300 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
14310 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
14320 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
14330 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
14340 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
14350 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
14360 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
14370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
14380 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
14390 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
143a0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
143b0 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
143c0 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
143d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
143e0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
143f0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
14400 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
14410 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
14420 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14440 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
14450 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
14460 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
14470 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
14480 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
14490 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
144a0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
144b0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
144c0 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
144d0 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
144e0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
144f0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
14500 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
14510 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
14520 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
14530 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14540 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
14550 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14560 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
14570 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
14580 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
14590 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
145a0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
145b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
145c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
145d0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
145e0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
145f0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
14600 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
14610 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
14620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
14630 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
14640 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
14650 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
14660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14670 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
14680 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
14690 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
146a0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
146b0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
146c0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
146d0 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
146e0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
146f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14700 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14710 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
14720 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14750 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
14760 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
14770 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20 20   saved_nBtm;    
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14790 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
147a0 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
147b0 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61  nBtm */.  u16 sa
147c0 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20 20  ved_nTop;       
147d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
147e0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
147f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
14800 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  p */.  u16 saved
14810 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20  _nSkip;         
14820 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14830 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14840 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32  ->nSkip */.  u32
14850 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20   saved_wsFlags; 
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14870 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
14880 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  f pNew->wsFlags 
14890 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65  */.  LogEst save
148a0 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  d_nOut;         
148b0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
148c0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
148d0 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nOut */.  int rc
148e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
148f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
14900 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f  urn code */.  Lo
14910 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14930 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
14940 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
14950 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
14960 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
14970 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
14980 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a  f table size */.
14990 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
149a0 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30  p = 0, *pBtm = 0
149b0 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74  ; /* Top and bot
149c0 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  tom range constr
149d0 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77  aints */..  pNew
149e0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
149f0 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  w;.  if( db->mal
14a00 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
14a10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
14a20 42 4b 50 54 3b 0a 20 20 57 48 45 52 45 54 52 41  BKPT;.  WHERETRA
14a30 43 45 28 30 78 38 30 30 2c 20 28 22 42 45 47 49  CE(0x800, ("BEGI
14a40 4e 20 61 64 64 42 74 72 65 65 49 64 78 28 25 73  N addBtreeIdx(%s
14a50 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20  ), nEq=%d\n",.  
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65     pProbe->zName
14a80 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  , pNew->u.btree.
14a90 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  nEq));..  assert
14aa0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
14ab0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
14ac0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
14ad0 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
14ae0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
14af0 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
14b00 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
14b10 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
14b20 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
14b30 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
14b40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
14b50 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
14b60 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a  tree.nBtm==0 );.
14b70 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
14b80 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
14b90 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
14ba0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
14bb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
14bc0 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
14bd0 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
14be0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
14bf0 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
14c00 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
14c10 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
14c20 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f  umn );..  saved_
14c30 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
14c40 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
14c50 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nBtm = pNew->u.
14c60 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61  btree.nBtm;.  sa
14c70 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d  ved_nTop = pNew-
14c80 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20  >u.btree.nTop;. 
14c90 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
14ca0 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
14cb0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
14cc0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
14cd0 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
14ce0 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
14cf0 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
14d00 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
14d10 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
14d20 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
14d30 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
14d40 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
14d50 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
14d60 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
14d90 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
14da0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
14db0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
14dc0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
14dd0 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
14de0 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
14df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14e00 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
14e10 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
14e20 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
14e30 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
14e40 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
14e50 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
14e60 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
14e70 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
14e80 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
14e90 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
14ea0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
14eb0 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
14ec0 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
14ed0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
14ee0 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
14ef0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14f00 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
14f10 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
14f20 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
14f30 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
14f40 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
14f50 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
14f60 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
14f70 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
14f80 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
14f90 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
14fa0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
14fb0 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
14fc0 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
14fd0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
14fe0 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
14ff0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
15000 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
15010 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
15020 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
15030 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
15040 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
15050 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
15060 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
15070 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
15080 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
15090 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
150a0 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
150b0 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
150c0 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
150d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
150e0 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
150f0 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
15100 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
15110 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
15120 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69 6e  low IS constrain
15130 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52  ts from the WHER
15140 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75  E clause to be u
15150 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  sed by the.    *
15160 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  * right table of
15170 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f   a LEFT JOIN.  O
15180 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nly constraints 
15190 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
151a0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f   are.    ** allo
151b0 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  wed */.    if( (
151c0 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  pSrc->fg.jointyp
151d0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
151e0 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
151f0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
15200 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
15210 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f 70  in).     && (eOp
15220 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e   & (WO_IS|WO_ISN
15230 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a  ULL))!=0.    ){.
15240 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15250 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
15260 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
15270 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
15280 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
15290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65  ;.    }..    pNe
152a0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
152b0 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ed_wsFlags;.    
152c0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
152d0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
152e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
152f0 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
15300 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  tm;.    pNew->u.
15310 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76  btree.nTop = sav
15320 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65  ed_nTop;.    pNe
15330 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
15340 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
15350 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
15360 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
15370 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
15380 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
15390 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
153a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
153b0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
153c0 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
153d0 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
153e0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
153f0 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
15400 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
15410 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
15420 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
15430 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
15440 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
15450 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
15460 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
15470 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
15480 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
15490 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
154a0 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
154b0 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
154c0 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
154d0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
154e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
154f0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
15500 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
15510 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28  MN_IN;.      if(
15520 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
15530 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
15540 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
15550 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
15560 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47  T ...)":  TUNING
15570 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  : the SELECT ret
15580 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
15590 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
155a0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
155b0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
155c0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
155d0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
155e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
155f0 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6f 66  y actually be of
15600 20 74 68 65 20 66 6f 72 6d 20 28 78 2c 20 79 29   the form (x, y)
15610 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 2e   IN (SELECT...).
15620 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
15630 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
15640 73 20 61 20 73 65 70 61 72 61 74 65 20 74 65 72  s a separate ter
15650 6d 20 66 6f 72 20 65 61 63 68 20 6f 66 20 28 78  m for each of (x
15660 29 20 61 6e 64 20 28 79 29 2e 0a 20 20 20 20 20  ) and (y)..     
15670 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74     ** However, t
15680 68 65 20 6e 49 6e 20 6d 75 6c 74 69 70 6c 69 65  he nIn multiplie
15690 72 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  r should only be
156a0 20 61 70 70 6c 69 65 64 20 6f 6e 63 65 2c 20 6e   applied once, n
156b0 6f 74 20 6f 6e 63 65 0a 20 20 20 20 20 20 20 20  ot once.        
156c0 2a 2a 20 66 6f 72 20 65 61 63 68 20 73 75 63 68  ** for each such
156d0 20 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f   term. The follo
156e0 77 69 6e 67 20 6c 6f 6f 70 20 63 68 65 63 6b 73  wing loop checks
156f0 20 74 68 61 74 20 70 54 65 72 6d 20 69 73 20 74   that pTerm is t
15700 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  he.        ** fi
15710 72 73 74 20 73 75 63 68 20 74 65 72 6d 20 69 6e  rst such term in
15720 20 75 73 65 2c 20 61 6e 64 20 73 65 74 73 20 6e   use, and sets n
15730 49 6e 20 62 61 63 6b 20 74 6f 20 30 20 69 66 20  In back to 0 if 
15740 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20  it is not. */.  
15750 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15760 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  <pNew->nLTerm-1;
15770 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15780 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72   if( pNew->aLTer
15790 6d 5b 69 5d 20 26 26 20 70 4e 65 77 2d 3e 61 4c  m[i] && pNew->aL
157a0 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d  Term[i]->pExpr==
157b0 70 45 78 70 72 20 29 20 6e 49 6e 20 3d 20 30 3b  pExpr ) nIn = 0;
157c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
157d0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
157e0 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
157f0 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
15800 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
15810 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
15820 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
15830 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
15840 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  In = sqlite3LogE
15850 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  st(pExpr->x.pLis
15860 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
15870 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
15880 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
15890 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
158a0 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
158b0 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e  ** changes "x IN
158e0 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22   (?)" into "x=?"
158f0 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
15900 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
15910 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
15920 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
15930 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
15940 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  umn[saved_nEq];.
15950 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
15960 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
15970 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73  UMN_EQ;.      as
15980 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d  sert( saved_nEq=
15990 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  =pNew->u.btree.n
159a0 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq );.      if( 
159b0 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a  iCol==XN_ROWID .
159c0 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e         || (iCol>
159d0 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26  0 && nInMul==0 &
159e0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
159f0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a  obe->nKeyCol-1).
15a00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
15a10 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
15a20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e  pProbe->uniqNotN
15a30 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
15a40 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15a50 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57  s |= WHERE_UNQ_W
15a60 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d  ANTED;.        }
15a70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15a80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15a90 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
15aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15ab0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15ac0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
15ad0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
15ae0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
15af0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
15b00 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
15b10 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
15b20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15b30 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a   eOp & WO_GT );.
15b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15b50 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  eOp & WO_GE );. 
15b60 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
15b70 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
15b80 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
15b90 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
15ba0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
15bb0 74 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  tm = whereRangeV
15bc0 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
15bd0 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
15be0 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
15bf0 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
15c00 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
15c10 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
15c20 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
15c30 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
15c40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
15c50 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
15c60 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e      /* Range con
15c70 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
15c80 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  e from the LIKE 
15c90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65  optimization are
15ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
15cb0 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73  ys used in pairs
15cc0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  . */.        pTo
15cd0 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20  p = &pTerm[1];. 
15ce0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
15cf0 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43  pTop-(pTerm->pWC
15d00 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43  ->a))<pTerm->pWC
15d10 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  ->nTerm );.     
15d20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
15d30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
15d40 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20  LIKEOPT );.     
15d50 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
15d60 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
15d70 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
15d80 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
15d90 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
15da0 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
15db0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
15dc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
15dd0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
15de0 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20  +] = pTop;.     
15df0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15e00 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
15e10 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MIT;.        pNe
15e20 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
15e30 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
15e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
15e50 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
15e60 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
15e70 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
15e80 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
15e90 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15ea0 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
15eb0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
15ec0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
15ed0 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
15ee0 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77  IMIT;.      pNew
15ef0 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
15f00 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f   whereRangeVecto
15f10 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  rLen(.          
15f20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43  pParse, pSrc->iC
15f30 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73  ursor, pProbe, s
15f40 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a  aved_nEq, pTerm.
15f50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
15f60 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
15f70 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
15f80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15f90 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
15fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15fb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
15fc0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
15fd0 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
15fe0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
15ff0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
16000 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
16010 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
16020 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
16030 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
16040 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
16050 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
16060 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
16070 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
16080 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
16090 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
160a0 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
160b0 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
160c0 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
160d0 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
160e0 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
160f0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
16100 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
16110 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
16120 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
16130 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
16140 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
16150 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
16160 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
16170 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
16180 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
16190 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
161a0 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
161b0 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
161c0 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
161d0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
161e0 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
161f0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
16200 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
16210 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
16220 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
16230 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
16240 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
16250 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
16260 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
16270 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
16280 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
16290 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
162a0 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
162b0 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
162c0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
162d0 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
162e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
162f0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
16300 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
16310 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
16320 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
16330 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
16340 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
16350 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
16360 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
16370 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
16380 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
16390 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
163a0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
163b0 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
163c0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
163d0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
163e0 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
163f0 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
16400 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
16410 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
16420 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
16430 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
16440 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16450 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
16460 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
16470 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
16480 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
16490 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
164a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
164b0 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
164c0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
164d0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
164e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
164f0 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
16500 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
16510 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
16520 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16530 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
16540 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16550 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
16560 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
16570 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
16580 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
16590 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
165a0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
165b0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
165c0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
165d0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
165e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
165f0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
16600 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
16610 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
16620 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
16630 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
16640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
16650 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
16660 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
16670 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
16680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16690 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
166a0 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
166b0 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
166c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
166d0 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
166e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
166f0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
16700 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
16710 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
16720 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
16730 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
16740 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
16750 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
16760 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
16770 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
16780 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
16790 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
167a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
167b0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
167c0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
167d0 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
167e0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
167f0 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
16800 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
16810 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
16820 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
16830 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
16840 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
16850 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
16860 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
16870 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
16880 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
16890 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
168a0 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
168b0 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
168c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
168d0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
168e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
168f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16900 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
16910 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
16920 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
16930 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
16940 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
16950 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
16960 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
16970 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
16980 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
16990 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
169a0 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
169b0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
169c0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
169d0 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
169e0 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
169f0 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
16a00 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
16a10 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
16a20 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
16a30 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
16a40 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
16a50 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
16a60 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
16a70 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
16a80 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
16a90 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
16aa0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
16ab0 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
16ac0 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
16ad0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
16ae0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
16af0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
16b00 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
16b10 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
16b20 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
16b30 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
16b40 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
16b50 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
16b60 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
16b70 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
16b80 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
16b90 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
16ba0 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
16bb0 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
16bc0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
16bd0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
16be0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
16bf0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
16c00 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
16c10 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
16c20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
16c30 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
16c40 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
16c50 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
16c60 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
16c70 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
16c80 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
16c90 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
16ca0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
16cb0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
16cc0 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
16cd0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
16ce0 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
16cf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
16d00 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
16d10 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
16d20 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
16d30 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
16d40 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
16d50 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
16d60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16d70 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
16d80 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
16d90 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
16da0 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
16db0 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
16dc0 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
16dd0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
16de0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
16df0 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
16e00 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
16e10 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  tm;.  pNew->u.bt
16e20 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64  ree.nTop = saved
16e30 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nTop;.  pNew->n
16e40 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
16e50 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ip;.  pNew->wsFl
16e60 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
16e70 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  ags;.  pNew->nOu
16e80 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
16e90 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
16ea0 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a   saved_nLTerm;..
16eb0 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73    /* Consider us
16ec0 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20  ing a skip-scan 
16ed0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
16ee0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
16ef0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76  straints.  ** av
16f00 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
16f10 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
16f20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
16f30 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65  d if the average
16f40 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
16f50 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c  repeats in the l
16f60 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69  eft-most terms i
16f70 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a  s at least 18. .
16f80 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61    **.  ** The ma
16f90 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73  gic number 18 is
16fa0 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65   selected on the
16fb0 20 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e   basis that scan
16fc0 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a  ning 17 rows.  *
16fd0 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  * is almost alwa
16fe0 79 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20  ys quicker than 
16ff0 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65  an index seek (e
17000 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68  ven though if th
17010 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e  e index.  ** con
17020 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
17030 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73   2^17 rows we as
17040 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69  sume otherwise i
17050 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66  n other parts of
17060 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e  .  ** the code).
17070 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74   And, even if it
17080 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75   is not, it shou
17090 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75  ld not be too mu
170a0 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a  ch slower. .  **
170b0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
170c0 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65  nd, the extra se
170d0 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70  eks could end up
170e0 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61   being significa
170f0 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65  ntly.  ** more e
17100 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20  xpensive.  */.  
17110 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69  assert( 42==sqli
17120 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b  te3LogEst(18) );
17130 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71  .  if( saved_nEq
17140 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20  ==saved_nSkip.  
17150 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c   && saved_nEq+1<
17160 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a  pProbe->nKeyCol.
17170 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f     && pProbe->no
17180 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26  SkipScan==0.   &
17190 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  & pProbe->aiRowL
171a0 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  ogEst[saved_nEq+
171b0 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e  1]>=42  /* TUNIN
171c0 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73  G: Minimum for s
171d0 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26  kip-scan */.   &
171e0 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  & (rc = whereLoo
171f0 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
17200 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
17210 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
17220 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49  ){.    LogEst nI
17230 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ter;.    pNew->u
17240 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
17250 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b    pNew->nSkip++;
17260 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
17270 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
17280 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
17290 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
172a0 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20  E_SKIPSCAN;.    
172b0 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e  nIter = pProbe->
172c0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
172d0 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  d_nEq] - pProbe-
172e0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
172f0 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70  ed_nEq+1];.    p
17300 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74  New->nOut -= nIt
17310 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e  er;.    /* TUNIN
17320 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65  G:  Because unce
17330 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65  rtainties in the
17340 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73   estimates for s
17350 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73  kip-scan queries
17360 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31  ,.    ** add a 1
17370 2e 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f  .375 fudge facto
17380 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73  r to make skip-s
17390 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73  can slightly les
173a0 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20  s likely. */.   
173b0 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20   nIter += 5;.   
173c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
173d0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
173e0 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
173f0 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b  nIter + nInMul);
17400 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
17410 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
17420 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
17430 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
17440 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
17450 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a   = saved_nSkip;.
17460 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17470 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
17480 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54  s;.  }..  WHERET
17490 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e  RACE(0x800, ("EN
174a0 44 20 61 64 64 42 74 72 65 65 49 64 78 28 25 73  D addBtreeIdx(%s
174b0 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64  ), nEq=%d, rc=%d
174c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
174d0 20 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62             pProb
174e0 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f  e->zName, saved_
174f0 6e 45 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74  nEq, rc));.  ret
17500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17510 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
17520 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
17530 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
17540 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
17550 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
17560 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
17570 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
17580 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
17590 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
175a0 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
175b0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
175c0 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
175d0 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
175e0 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
175f0 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
17600 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
17610 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
17620 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
17630 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
17640 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
17650 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
17660 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
17670 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
17680 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
17690 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74  *pOB;.  ExprList
176a0 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e   *aColExpr;.  in
176b0 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
176c0 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
176d0 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
176e0 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
176f0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
17700 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
17710 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
17720 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
17730 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
17740 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
17750 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
17760 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
17770 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
17780 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
17790 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
177a0 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
177b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
177c0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
177d0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
177e0 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
177f0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
17800 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
17810 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
17820 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
17830 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
17840 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17850 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d   if( (aColExpr =
17860 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
17870 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  r)!=0 ){.      f
17880 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
17890 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
178a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
178b0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
178c0 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20  [jj]!=XN_EXPR ) 
178d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
178e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
178f0 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 61  rCompare(pExpr,a
17900 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70  ColExpr->a[jj].p
17910 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30  Expr,iCursor)==0
17920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17930 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
17940 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
17950 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17960 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17970 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20  a bitmask where 
17980 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  1s indicate that
17990 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
179a0 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  ng column of.** 
179b0 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65  the table is use
179c0 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20  d by an index.  
179d0 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36  Only the first 6
179e0 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  3 columns are co
179f0 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  nsidered..*/.sta
17a00 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75  tic Bitmask colu
17a10 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78  mnsInIndex(Index
17a20 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
17a30 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
17a40 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
17a50 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
17a60 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
17a70 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
17a80 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78  mn[j];.    if( x
17a90 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
17aa0 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20  tcase( x==BMS-1 
17ab0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17ac0 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
17ad0 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
17ae0 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28   ) m |= MASKBIT(
17af0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
17b00 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20  return m;.}../* 
17b10 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17b20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  a partial index 
17b30 77 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57  with pPartIndexW
17b40 68 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  here can be used
17b50 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
17b60 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  nt query.  Retur
17b70 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e  n true if it can
17b80 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66   be and false if
17b90 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
17ba0 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50  int whereUsableP
17bb0 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20  artialIndex(int 
17bc0 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73  iTab, WhereClaus
17bd0 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57  e *pWC, Expr *pW
17be0 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  here){.  int i;.
17bf0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
17c00 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68  rm;.  while( pWh
17c10 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ere->op==TK_AND 
17c20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72  ){.    if( !wher
17c30 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
17c40 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68  dex(iTab,pWC,pWh
17c50 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65  ere->pLeft) ) re
17c60 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65  turn 0;.    pWhe
17c70 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69  re = pWhere->pRi
17c80 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ght;.  }.  for(i
17c90 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
17ca0 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
17cb0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
17cc0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
17cd0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
17ce0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
17cf0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
17d00 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61  xpr, pWhere, iTa
17d10 62 29 20 0a 20 20 20 20 20 26 26 20 28 21 45 78  b) .     && (!Ex
17d20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17d30 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
17d40 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67  ) || pExpr->iRig
17d50 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
17d60 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  b).    ){.      
17d70 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
17d80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17d90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
17da0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
17db0 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
17dc0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
17dd0 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
17de0 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69  e.** is identifi
17df0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
17e00 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
17e10 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
17e20 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
17e30 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
17e40 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
17e50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
17e60 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
17e70 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
17e80 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
17e90 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
17ea0 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
17eb0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
17ec0 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
17ed0 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
17ee0 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
17ef0 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
17f00 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
17f10 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
17f20 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
17f30 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
17f40 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
17f50 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
17f80 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
17f90 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
17fa0 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
17fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
17fc0 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
17fd0 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
17fe0 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
17ff0 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
18000 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
18010 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
18020 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
18030 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
18040 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
18050 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
18060 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
18070 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
18080 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18090 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
180a0 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
180b0 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
180c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
180d0 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
180e0 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
180f0 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
18100 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
18110 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
18120 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
18130 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
18140 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18150 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
18160 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
18170 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
18180 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
18190 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
181a0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
181b0 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
181c0 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
181d0 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
181e0 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
181f0 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
18200 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
18210 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
18220 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
18230 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
18240 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
18250 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
18260 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
18270 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
18280 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
18290 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
182a0 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
182b0 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
182c0 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
182d0 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
182e0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
182f0 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
18300 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
18310 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
18320 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
18330 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
18340 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
18350 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
18360 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
18370 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
18380 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
18390 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
183a0 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
183b0 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
183c0 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
183d0 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
183e0 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
183f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
18400 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
18410 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
18420 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
18430 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
18440 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
18450 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
18460 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
18470 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
18480 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
18490 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
184a0 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
184b0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
184c0 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20  rereq           
184d0 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
184e0 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
184f0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
18500 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
18510 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
18520 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
18530 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
18540 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18560 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
18570 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
18580 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
18590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
185a0 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
185b0 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
185c0 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
185d0 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
185e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
185f0 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
18600 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
18610 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
18620 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
18630 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
18640 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
18650 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
18660 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
18670 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
18680 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18690 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
186a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
186b0 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
186c0 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
186d0 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
186e0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
186f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
18700 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
18710 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
18720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
18730 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18740 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
18750 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
18760 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18770 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
18780 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
18790 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
187a0 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
187b0 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
187e0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
187f0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
18800 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18810 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
18820 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18830 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
18840 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18850 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
18860 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
18870 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
18880 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
18890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
188a0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
188b0 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
188c0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
188d0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
188e0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
188f0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
18900 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
18910 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
18920 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
18930 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
18940 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
18950 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
18960 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
18970 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
18980 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
18990 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
189a0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
189b0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
189c0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
189d0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
189e0 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
189f0 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
18a00 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
18a10 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
18a20 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
18a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18a40 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
18a50 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
18a60 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
18a70 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
18a80 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
18a90 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
18aa0 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
18ab0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
18ac0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
18ad0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
18ae0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
18af0 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
18b00 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
18b10 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
18b20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
18b30 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
18b40 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
18b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b60 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
18b70 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
18b80 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
18b90 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
18ba0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
18bb0 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
18bc0 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
18bd0 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
18be0 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
18bf0 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
18c00 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
18c10 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
18c20 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
18c30 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
18c40 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
18c50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
18c60 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
18c70 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
18c80 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
18c90 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
18ca0 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
18cb0 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
18cc0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
18cd0 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
18ce0 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
18cf0 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
18d00 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
18d10 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
18d20 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
18d30 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
18d40 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
18d50 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
18d60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
18d70 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
18d80 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
18d90 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
18da0 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
18db0 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
18dc0 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
18dd0 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
18de0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18df0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
18e00 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
18e10 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
18e20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
18e30 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
18e40 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
18e50 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
18e60 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
18e70 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
18e80 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
18e90 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
18ea0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
18eb0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
18ec0 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
18ed0 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
18ee0 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
18ef0 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
18f00 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
18f10 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
18f20 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
18f30 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
18f40 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
18f50 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
18f60 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
18f70 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
18f80 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
18f90 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
18fa0 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
18fb0 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
18fc0 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
18fd0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
18fe0 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
18ff0 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
19000 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
19010 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
19020 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
19030 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
19040 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
19050 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
19060 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19070 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
19080 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
19090 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
190a0 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
190b0 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
190c0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
190d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
190e0 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
190f0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
19100 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
19110 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
19120 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
19130 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
19140 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
19150 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19160 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
19170 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
19180 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
19190 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
191a0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
191b0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
191c0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
191d0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
191e0 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
191f0 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
19200 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
19210 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
19220 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
19230 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
19240 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19250 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
19260 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
19270 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
19280 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
19290 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
192a0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
192b0 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c  bles or 1.375 (L
192c0 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65  ogEst=4) for vie
192d0 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
192e0 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
192f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
19300 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
19310 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
19320 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
19330 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
19340 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
19350 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
19360 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
19370 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
19380 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
19390 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
193a0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
193b0 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
193c0 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
193d0 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
193e0 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
193f0 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
19400 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
19410 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
19420 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  ze + 4;.        
19430 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
19440 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
19450 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
19460 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
19470 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
19480 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20  etup += 24;.    
19490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
194a0 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
194b0 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
194c0 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
194d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
194e0 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20 70 4e  w->rSetup<0 ) pN
194f0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
19500 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
19510 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
19520 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
19530 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
19540 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
19550 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
19560 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
19570 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
19580 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
19590 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
195a0 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
195b0 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
195c0 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
195d0 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
195e0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
195f0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
19600 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
19610 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
19620 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
19630 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
19640 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
19650 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
19660 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
19670 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
19680 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
19690 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
196a0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
196b0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
196c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
196d0 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c  ereq = mPrereq |
196e0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
196f0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
19700 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
19710 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
19720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19730 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
19740 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
19750 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
19760 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
19770 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
19780 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
19790 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
197a0 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
197b0 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
197c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
197d0 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
197e0 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
197f0 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
19800 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
19810 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
19820 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
19830 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
19840 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
19850 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
19860 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
19870 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
19880 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
19890 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
198a0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
198b0 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
198c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
198d0 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
198e0 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
198f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
19900 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19910 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30  u.btree.nBtm = 0
19920 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
19930 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20  ree.nTop = 0;.  
19940 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
19950 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
19960 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
19970 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
19980 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
19990 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
199a0 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
199b0 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  q;.    pNew->nOu
199c0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70  t = rSize;.    p
199d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
199e0 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
199f0 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
19a00 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
19a10 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
19a20 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
19a30 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
19a40 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
19a50 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
19a60 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
19a70 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
19a80 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
19a90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
19aa0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
19ab0 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
19ac0 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
19ad0 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
19ae0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
19af0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
19b00 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
19b10 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
19b20 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
19b30 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
19b40 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
19b50 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
19b60 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
19b70 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
19b80 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
19b90 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
19ba0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
19bb0 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
19bc0 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
19bd0 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
19be0 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
19bf0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
19c00 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
19c10 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
19c20 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
19c30 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
19c40 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
19c50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
19c60 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
19c70 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
19c80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19c90 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
19ca0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
19cb0 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
19cc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
19cd0 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
19ce0 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
19cf0 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
19d00 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
19d10 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
19d20 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
19d30 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
19d40 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70  robe);.        p
19d50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  New->wsFlags = (
19d60 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49  m==0) ? (WHERE_I
19d70 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e  DX_ONLY|WHERE_IN
19d80 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49  DEXED) : WHERE_I
19d90 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a  NDEXED;.      }.
19da0 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73  .      /* Full s
19db0 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f  can via index */
19dc0 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20  .      if( b.   
19dd0 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
19de0 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c  (pTab).       ||
19df0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
19e00 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20  xWhere!=0.      
19e10 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
19e20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
19e30 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
19e40 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65        && (pProbe
19e50 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
19e60 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20  >szTabRow).     
19e70 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
19e80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
19e90 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
19ea0 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
19eb0 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
19ec0 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
19ed0 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
19ee0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
19ef0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
19f00 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
19f10 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
19f20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
19f30 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
19f40 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
19f50 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20  dx : 0;..       
19f60 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
19f70 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64  visiting the ind
19f80 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20  ex rows is N*K, 
19f90 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20  where K is.     
19fa0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e     ** between 1.
19fb0 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e  1 and 3.0, depen
19fc0 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61  ding on the rela
19fd0 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
19fe0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
19ff0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77  ex and table row
1a000 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
1a010 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
1a020 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
1a030 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
1a040 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
1a050 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b       if( m!=0 ){
1a060 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1a070 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
1a080 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
1a090 61 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63  an, add in the c
1a0a0 6f 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ost of.         
1a0b0 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20   ** doing table 
1a0c0 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f  lookups.  The co
1a0d0 73 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68  st will be 3x th
1a0e0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
1a0f0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73        ** lookups
1a100 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63  .  Take into acc
1a110 6f 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  ount WHERE claus
1a120 65 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e  e terms that can
1a130 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
1a140 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
1a150 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c   just the index,
1a160 20 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74   and that do not
1a170 20 72 65 71 75 69 72 65 20 61 0a 20 20 20 20 20   require a.     
1a180 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f       ** table lo
1a190 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20  okup. */.       
1a1a0 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75     LogEst nLooku
1a1b0 70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20  p = rSize + 16; 
1a1c0 20 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20   /* Base cost:  
1a1d0 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  N*3 */.         
1a1e0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1a1f0 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53     int iCur = pS
1a200 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  rc->iCursor;.   
1a210 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
1a220 73 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e  se *pWC2 = &pWIn
1a230 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20  fo->sWC;.       
1a240 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1a250 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  pWC2->nTerm; ii+
1a260 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1a270 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1a280 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b   = &pWC2->a[ii];
1a290 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a2a0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76   !sqlite3ExprCov
1a2b0 65 72 65 64 42 79 49 6e 64 65 78 28 70 54 65 72  eredByIndex(pTer
1a2c0 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20  m->pExpr, iCur, 
1a2d0 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
1a2e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65            /* pTe
1a310 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  rm can be evalua
1a320 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ted using just t
1a330 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65  he index.  So re
1a340 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  duce.           
1a350 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65 64   ** the expected
1a360 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
1a370 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69   lookups accordi
1a380 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  ngly */.        
1a390 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
1a3a0 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
1a3c0 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  okup += pTerm->t
1a3d0 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
1a3e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a3f0 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b             nLook
1a400 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  up--;.          
1a410 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1a420 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
1a430 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b  Q|WO_IS) ) nLook
1a440 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20  up -= 19;.      
1a450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a460 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20    }.          . 
1a470 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
1a480 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
1a490 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
1a4a0 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20  n, nLookup);.   
1a4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
1a4c0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
1a4d0 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
1a4e0 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
1a4f0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
1a500 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
1a510 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
1a520 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1a530 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1a540 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1a550 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1a560 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
1a570 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
1a580 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1a590 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ..    rc = where
1a5a0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
1a5b0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
1a5c0 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23 69  , pProbe, 0);.#i
1a5d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a5e0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
1a5f0 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
1a600 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
1a610 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
1a620 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
1a630 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
1a640 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
1a650 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
1a660 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
1a670 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a680 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
1a690 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
1a6a0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
1a6b0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
1a6c0 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20 62  rc->pIBIndex ) b
1a6d0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1a6e0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1a6f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1a700 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a  RTUALTABLE../*.*
1a710 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 49  * Argument pIdxI
1a720 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20 70  nfo is already p
1a730 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c  opulated with al
1a740 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  l constraints th
1a750 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65  at may.** be use
1a760 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61 6c  d by the virtual
1a770 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
1a780 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
1a790 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73 0a  New->iTab. This.
1a7a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b  ** function mark
1a7b0 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68  s a subset of th
1a7c0 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ose constraints 
1a7d0 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73 20  usable, invokes 
1a7e0 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  the.** xBestInde
1a7f0 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64 64  x method and add
1a800 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  s the returned p
1a810 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72 2e  lan to pBuilder.
1a820 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61  .**.** A constra
1a830 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75 73  int is marked us
1a840 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  able if:.**.**  
1a850 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73 61   * Argument mUsa
1a860 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ble indicates th
1a870 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69 73  at its prerequis
1a880 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61 62  ites are availab
1a890 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  le, and.**.**   
1a8a0 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65 20  * It is not one 
1a8b0 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
1a8c0 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
1a8d0 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b 20  e mExclude mask 
1a8e0 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61 73  passed.**     as
1a8f0 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
1a900 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20 70  ment (which in p
1a910 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68 65  ractice is eithe
1a920 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a  r WO_IN or 0)..*
1a930 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d 50  *.** Argument mP
1a940 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1a950 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
1a960 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1a970 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69 72  efore the.** vir
1a980 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71 75  tual table in qu
1a990 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61 72  estion. These ar
1a9a0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
1a9b0 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69 74  lans prerequisit
1a9c0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20  es.** before it 
1a9d0 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75 69  is added to pBui
1a9e0 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70  lder..**.** Outp
1a9f0 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62  ut parameter *pb
1aa00 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  In is set to tru
1aa10 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61 64  e if the plan ad
1aa20 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 0a  ded to pBuilder.
1aa30 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ** uses one or m
1aa40 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73 2c  ore WO_IN terms,
1aa50 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
1aa60 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1aa70 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
1aa80 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68 65  irtualOne(.  Whe
1aa90 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
1aaa0 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d 61  Builder,.  Bitma
1aab0 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20  sk mPrereq,     
1aac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1aad0 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
1aae0 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e 20  t must be used. 
1aaf0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 73  */.  Bitmask mUs
1ab00 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1ab10 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ab20 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a 2f  usable tables */
1ab30 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65 2c  .  u16 mExclude,
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab50 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74 65     /* Exclude te
1ab60 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65 20  rms using these 
1ab70 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 73  operators */.  s
1ab80 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1ab90 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20 2f  o *pIdxInfo,   /
1aba0 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a 65  * Populated obje
1abb0 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65  ct for xBestInde
1abc0 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  x */.  u16 mNoOm
1abd0 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
1abe0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1abf0 20 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e 73   omit these cons
1ac00 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  traints */.  int
1ac10 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20 20   *pbIn          
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac30 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c 61  OUT: True if pla
1ac40 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e  n uses an IN(...
1ac50 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  ) op */.){.  Whe
1ac60 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
1ac70 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1ac80 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
1ac90 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1aca0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
1acb0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1acc0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
1acd0 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70 49  age *pUsage = pI
1ace0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1acf0 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74 20  intUsage;.  int 
1ad00 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b  i;.  int mxTerm;
1ad10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ad20 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f  TE_OK;.  WhereLo
1ad30 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c  op *pNew = pBuil
1ad40 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72  der->pNew;.  Par
1ad50 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42 75  se *pParse = pBu
1ad60 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
1ad70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74 20  Parse;.  struct 
1ad80 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1ad90 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e  rc = &pBuilder->
1ada0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1adb0 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1adc0 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
1add0 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt = pIdxInfo->n
1ade0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61  Constraint;..  a
1adf0 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65 20  ssert( (mUsable 
1ae00 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72 65  & mPrereq)==mPre
1ae10 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d  req );.  *pbIn =
1ae20 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72   0;.  pNew->prer
1ae30 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20  eq = mPrereq;.. 
1ae40 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61 62   /* Set the usab
1ae50 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73  le flag on the s
1ae60 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61  ubset of constra
1ae70 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64 20  ints identified 
1ae80 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e  by .  ** argumen
1ae90 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d  ts mUsable and m
1aea0 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49  Exclude. */.  pI
1aeb0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
1aec0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1aed0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
1aee0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1aef0 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
1af00 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1af10 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
1af20 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1af30 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
1af40 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
1af50 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78  ffset];.    pIdx
1af60 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
1af70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1af80 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
1af90 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d  mUsable)==pTerm-
1afa0 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20 20  >prereqRight .  
1afb0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f     && (pTerm->eO
1afc0 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75  perator & mExclu
1afd0 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  de)==0.    ){.  
1afe0 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
1aff0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
1b000 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
1b010 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
1b020 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71  fields of the sq
1b030 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1b040 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1b050 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
1b060 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
1b070 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29  0])*nConstraint)
1b080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
1b090 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1b0a0 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70  IdxStr==0 );.  p
1b0b0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
1b0c0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1b0d0 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
1b0e0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1b0f0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
1b100 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1b110 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
1b120 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
1b130 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f  le)2;.  pIdxInfo
1b140 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
1b150 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f  = 25;.  pIdxInfo
1b160 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a  ->idxFlags = 0;.
1b170 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55    pIdxInfo->colU
1b180 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  sed = (sqlite3_i
1b190 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73  nt64)pSrc->colUs
1b1a0 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  ed;..  /* Invoke
1b1b0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1b1c0 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  le xBestIndex() 
1b1d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d  method */.  rc =
1b1e0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
1b1f0 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54 61  Parse, pSrc->pTa
1b200 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
1b210 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1b220 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20  rc;..  mxTerm = 
1b230 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  -1;.  assert( pN
1b240 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e  ew->nLSlot>=nCon
1b250 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72  straint );.  for
1b260 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
1b270 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
1b280 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
1b290 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1b2a0 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49  itMask = 0;.  pI
1b2b0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
1b2c0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1b2d0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
1b2e0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1b2f0 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
1b300 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1b310 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
1b320 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a  .    int iTerm;.
1b330 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d      if( (iTerm =
1b340 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
1b350 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a  ndex - 1)>=0 ){.
1b360 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1b370 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  *pTerm;.      in
1b380 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e  t j = pIdxCons->
1b390 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
1b3a0 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
1b3b0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
1b3c0 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c   || j<0.       |
1b3d0 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a  | j>=pWC->nTerm.
1b3e0 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
1b3f0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
1b400 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 43  .       || pIdxC
1b410 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20  ons->usable==0. 
1b420 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b430 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1b440 52 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  R;.        sqlit
1b450 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b460 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78  e,"%s.xBestIndex
1b470 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53   malfunction",pS
1b480 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
1b490 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1b4a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b4b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1b4c0 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
1b4d0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
1b4e0 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20  ase( j==0 );.   
1b4f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1b500 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
1b510 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
1b520 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
1b530 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
1b540 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1b550 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
1b560 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
1b570 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
1b580 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
1b590 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
1b5a0 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72   if( iTerm>mxTer
1b5b0 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65  m ) mxTerm = iTe
1b5c0 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  rm;.      testca
1b5d0 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1b5e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b5f0 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20   iTerm==16 );.  
1b600 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
1b610 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
1b620 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
1b630 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
1b640 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66  <iTerm;.      if
1b650 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1b660 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
1b670 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
1b680 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
1b690 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
1b6a0 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
1b6b0 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
1b6c0 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65    ** consume the
1b6d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b6e0 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65   because (1) the
1b6f0 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72   order of IN ter
1b700 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ms.        ** is
1b710 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1b720 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1b730 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1b740 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1b750 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
1b760 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
1b770 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
1b780 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
1b790 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
1b7a0 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
1b7b0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
1b7c0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
1b7d0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
1b7e0 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53  ->idxFlags &= ~S
1b7f0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
1b800 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20  _UNIQUE;.       
1b810 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65   *pbIn = 1; asse
1b820 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20  rt( (mExclude & 
1b830 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  WO_IN)==0 );.   
1b840 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b850 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1b860 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d  itMask &= ~mNoOm
1b870 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  it;..  pNew->nLT
1b880 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
1b890 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1b8a0 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
1b8b0 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  Slot );.  pNew->
1b8c0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
1b8d0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
1b8e0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1b8f0 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
1b900 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1b910 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e  IdxStr;.  pIdxIn
1b920 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1b930 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  xStr = 0;.  pNew
1b940 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
1b950 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
1b960 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74  tr;.  pNew->u.vt
1b970 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
1b980 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  i8)(pIdxInfo->or
1b990 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a  derByConsumed ?.
1b9a0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
1b9b0 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20  nOrderBy : 0);. 
1b9c0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1b9d0 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  0;.  pNew->rRun 
1b9e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46  = sqlite3LogEstF
1b9f0 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
1ba00 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
1ba10 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  t);.  pNew->nOut
1ba20 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1ba30 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1ba40 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a  atedRows);..  /*
1ba50 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f   Set the WHERE_O
1ba60 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68  NEROW flag if th
1ba70 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  e xBestIndex() m
1ba80 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a  ethod indicated.
1ba90 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63    ** that the sc
1baa0 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74  an will visit at
1bab0 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43   most one row. C
1bac0 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69 73  lear it otherwis
1bad0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78  e. */.  if( pIdx
1bae0 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26  Info->idxFlags &
1baf0 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43   SQLITE_INDEX_SC
1bb00 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20  AN_UNIQUE ){.   
1bb10 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
1bb20 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
1bb30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
1bb40 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  w->wsFlags &= ~W
1bb50 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d  HERE_ONEROW;.  }
1bb60 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  .  rc = whereLoo
1bb70 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
1bb80 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70  , pNew);.  if( p
1bb90 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1bba0 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
1bbb0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75  te3_free(pNew->u
1bbc0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1bbd0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1bbe0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1bbf0 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
1bc00 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25  xffff, ("  bIn=%
1bc10 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c  d prereqIn=%04ll
1bc20 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c  x prereqOut=%04l
1bc30 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lx\n",.         
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62               *pb
1bc50 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  In, (sqlite3_uin
1bc60 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20  t64)mPrereq,.   
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74     (sqlite3_uint
1bc90 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71  64)(pNew->prereq
1bca0 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a   & ~mPrereq)));.
1bcb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bcc0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1bcd0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1bce0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
1bcf0 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
1bd00 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
1bd10 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
1bd20 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
1bd30 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1bd40 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1bd50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1bd60 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20   are no LEFT or 
1bd70 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73  CROSS JOIN joins
1bd80 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62   in the query, b
1bd90 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64 0a  oth mPrereq and.
1bda0 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65  ** mUnusable are
1bdb0 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72   set to 0. Other
1bdc0 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69 73  wise, mPrereq is
1bdd0 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46   a mask of all F
1bde0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e  ROM clause.** en
1bdf0 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
1be00 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74   before the virt
1be10 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ual table in the
1be20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64   FROM clause and
1be30 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65   are.** separate
1be40 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
1be50 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
1be60 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69  r CROSS JOIN. Si
1be70 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20  milarly, the.** 
1be80 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63  mUnusable mask c
1be90 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d  ontains all FROM
1bea0 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20   clause entries 
1beb0 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72  that occur after
1bec0 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
1bed0 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65  table and are se
1bee0 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
1bef0 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
1bf00 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53  LEFT or .** CROS
1bf10 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46  S JOIN. .**.** F
1bf20 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1bf30 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a  he query were:.*
1bf40 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
1bf50 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e  t1, t2 LEFT JOIN
1bf60 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53   t3, t4, vt CROS
1bf70 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a  S JOIN t5, t6;.*
1bf80 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72 65  *.** then mPrere
1bf90 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  q corresponds to
1bfa0 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55   (t1, t2) and mU
1bfb0 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20  nusable to (t5, 
1bfc0 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  t6)..**.** All t
1bfd0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50 72  he tables in mPr
1bfe0 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63 61  ereq must be sca
1bff0 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  nned before the 
1c000 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  current virtual 
1c010 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e  .** table. So an
1c020 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1c030 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69  h all prerequisi
1c040 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65  tes are satisfie
1c050 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71  d by .** mPrereq
1c060 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65   may be specifie
1c070 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e  d as "usable" in
1c080 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42   all calls to xB
1c090 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f  estIndex. .** Co
1c0a0 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61  nversely, all ta
1c0b0 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c  bles in mUnusabl
1c0c0 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  e must be scanne
1c0d0 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  d after the curr
1c0e0 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  ent.** virtual t
1c0f0 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72  able, so any ter
1c100 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ms for which the
1c110 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   prerequisites o
1c120 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d  verlap with.** m
1c130 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20  Unusable should 
1c140 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67  always be config
1c150 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61  ured as "not-usa
1c160 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e  ble" for xBestIn
1c170 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
1c180 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
1c190 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
1c1a0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1c1b0 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
1c1c0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
1c1d0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
1c1e0 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20  mPrereq,        
1c1f0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
1c200 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1c210 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ned before this 
1c220 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  one */.  Bitmask
1c230 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20   mUnusable      
1c240 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1c250 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1c260 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20  nned after this 
1c270 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  one */.){.  int 
1c280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1c290 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c2a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65  rn code */.  Whe
1c2b0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
1c2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
1c2d0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
1c2e0 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
1c2f0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1c300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1c310 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1c320 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1c330 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
1c340 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1c350 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1c360 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
1c370 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1c380 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
1c390 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69  search */.  sqli
1c3a0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1c3b0 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65  p;       /* Obje
1c3c0 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  ct to pass to xB
1c3d0 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20  estIndex() */.  
1c3e0 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c400 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
1c410 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20  aints in p */.  
1c420 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20 20  int bIn;        
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c440 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65  True if plan use
1c450 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
1c460 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  or */.  WhereLoo
1c470 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61  p *pNew;.  Bitma
1c480 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20 20  sk mBest;       
1c490 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1c4a0 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20 70  s used by best p
1c4b0 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a  ossible plan */.
1c4c0 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a    u16 mNoOmit;..
1c4d0 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65 72    assert( (mPrer
1c4e0 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d  eq & mUnusable)=
1c4f0 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  =0 );.  pWInfo =
1c500 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1c510 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
1c520 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1c530 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1c540 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
1c550 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1c560 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
1c570 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
1c580 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65 72  ->iTab];.  asser
1c590 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  t( IsVirtual(pSr
1c5a0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70 20  c->pTab) );.  p 
1c5b0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
1c5c0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
1c5d0 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63   mUnusable, pSrc
1c5e0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
1c5f0 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d 4e  erBy, .      &mN
1c600 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70 3d  oOmit);.  if( p=
1c610 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1c620 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1c630 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1c640 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
1c650 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
1c660 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
1c670 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
1c680 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1c690 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e  Free = 0;.  nCon
1c6a0 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f  straint = p->nCo
1c6b0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
1c6c0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
1c6d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1c6e0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
1c6f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1c700 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1c710 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
1c720 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1c730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1c740 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65  t call xBestInde
1c750 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  x() with all con
1c760 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2e  straints usable.
1c770 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
1c780 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1c790 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c  alOne: all usabl
1c7a0 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20 77  e\n"));.  rc = w
1c7b0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1c7c0 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20  alOne(pBuilder, 
1c7d0 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53  mPrereq, ALLBITS
1c7e0 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  , 0, p, mNoOmit,
1c7f0 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66   &bIn);..  /* If
1c800 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42 65   the call to xBe
1c810 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61  stIndex() with a
1c820 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65 64  ll terms enabled
1c830 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61 6e   produced a plan
1c840 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  .  ** that does 
1c850 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
1c860 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28 49  source tables (I
1c870 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68 20  OW: a plan with 
1c880 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20  mBest==0),.  ** 
1c890 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
1c8a0 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67   point in making
1c8b0 20 61 6e 79 20 66 75 72 74 68 65 72 20 63 61 6c   any further cal
1c8c0 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1c8d0 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  () .  ** since t
1c8e0 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74  hey will all ret
1c8f0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65 73  urn the same res
1c900 75 6c 74 20 28 69 66 20 74 68 65 20 78 42 65 73  ult (if the xBes
1c910 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d  tIndex().  ** im
1c920 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
1c930 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20  sane). */.  if( 
1c940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c950 20 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77 2d   (mBest = (pNew-
1c960 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1c970 65 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  eq))!=0 ){.    i
1c980 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b  nt seenZero = 0;
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9a0 54 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20 77  True if a plan w
1c9b0 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 73  ith no prereqs s
1c9c0 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  een */.    int s
1c9d0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b  eenZeroNoIN = 0;
1c9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e           /* Plan
1c9f0 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73   with no prereqs
1ca00 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20   and no IN(...) 
1ca10 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d  seen */.    Bitm
1ca20 61 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20  ask mPrev = 0;. 
1ca30 20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74     Bitmask mBest
1ca40 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  NoIn = 0;..    /
1ca50 2a 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70 72  * If the plan pr
1ca60 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 65 61  oduced by the ea
1ca70 72 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73 20  rlier call uses 
1ca80 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c  an IN(...) term,
1ca90 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65   call.    ** xBe
1caa0 73 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20 74  stIndex again, t
1cab0 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 49 4e  his time with IN
1cac0 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73 61  (...) terms disa
1cad0 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  bled. */.    if(
1cae0 20 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57 48   bIn ){.      WH
1caf0 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1cb00 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1cb10 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e  ll usable w/o IN
1cb20 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1cb30 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1cb40 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1cb50 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1cb60 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20  rereq, ALLBITS, 
1cb70 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  WO_IN, p, mNoOmi
1cb80 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  t, &bIn);.      
1cb90 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20 29  assert( bIn==0 )
1cba0 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f 49  ;.      mBestNoI
1cbb0 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  n = pNew->prereq
1cbc0 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20   & ~mPrereq;.   
1cbd0 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e     if( mBestNoIn
1cbe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1cbf0 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20  eenZero = 1;.   
1cc00 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49       seenZeroNoI
1cc10 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  N = 1;.      }. 
1cc20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c     }..    /* Cal
1cc30 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e 63  l xBestIndex onc
1cc40 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74 69  e for each disti
1cc50 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70 72  nct value of (pr
1cc60 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72  ereqRight & ~mPr
1cc70 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e  ereq) .    ** in
1cc80 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d   the set of term
1cc90 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
1cca0 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74  the current virt
1ccb0 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ual table.  */. 
1ccc0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1ccd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cce0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69   int i;.      Bi
1ccf0 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c  tmask mNext = AL
1cd00 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73 73  LBITS;.      ass
1cd10 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a  ert( mNext>0 );.
1cd20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1cd30 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1cd40 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  +){.        Bitm
1cd50 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20 20  ask mThis = (.  
1cd60 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61            pWC->a
1cd70 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  [p->aConstraint[
1cd80 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e  i].iTermOffset].
1cd90 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d  prereqRight & ~m
1cda0 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20 29  Prereq.        )
1cdb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
1cdc0 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54 68  his>mPrev && mTh
1cdd0 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74  is<mNext ) mNext
1cde0 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20 20   = mThis;.      
1cdf0 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d 20  }.      mPrev = 
1ce00 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28  mNext;.      if(
1ce10 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20   mNext==ALLBITS 
1ce20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
1ce30 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20  f( mNext==mBest 
1ce40 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e  || mNext==mBestN
1ce50 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oIn ) continue;.
1ce60 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1ce70 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1ce80 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34  alOne: mPrev=%04
1ce90 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78  llx mNext=%04llx
1cea0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1cec0 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65  ite3_uint64)mPre
1ced0 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  v, (sqlite3_uint
1cee0 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20  64)mNext));.    
1cef0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1cf00 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1cf10 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1cf20 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78  r, mPrereq, mNex
1cf30 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c  t|mPrereq, 0, p,
1cf40 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1cf50 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
1cf60 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65 71  >prereq==mPrereq
1cf70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1cf80 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1cf90 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73    if( bIn==0 ) s
1cfa0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1cfb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1cfc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1cfd0 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1cfe0 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76 65  x() in the above
1cff0 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66 69   loop did not fi
1d000 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1d010 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1d020 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1d030 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65  at all (i.e. one
1d040 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1d050 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 29  e.    ** usable)
1d060 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68 65  , make a call he
1d070 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75 72  re with all sour
1d080 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62 6c  ce tables disabl
1d090 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ed */.    if( rc
1d0a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1d0b0 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20  eenZero==0 ){.  
1d0c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1d0d0 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1d0e0 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65  One: all disable
1d0f0 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  d\n"));.      rc
1d100 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1d110 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1d120 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1d130 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c  Prereq, mPrereq,
1d140 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20   0, p, mNoOmit, 
1d150 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &bIn);.      if(
1d160 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65   bIn==0 ) seenZe
1d170 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1d180 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1d190 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1d1a0 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20 66  ndex() have so f
1d1b0 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e  ar failed to fin
1d1c0 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20  d a plan.    ** 
1d1d0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f  that requires no
1d1e0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61   source tables a
1d1f0 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e  t all and does n
1d200 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e  ot use an IN(...
1d210 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ).    ** operato
1d220 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20  r, make a final 
1d230 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f  call to obtain o
1d240 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20  ne here.  */.   
1d250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d260 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f  OK && seenZeroNo
1d270 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  IN==0 ){.      W
1d280 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1d290 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1d2a0 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e 64  all disabled and
1d2b0 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20   w/o IN\n"));.  
1d2c0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1d2d0 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1d2e0 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c  .          pBuil
1d2f0 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50  der, mPrereq, mP
1d300 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c  rereq, WO_IN, p,
1d310 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1d320 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1d330 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  ( p->needToFreeI
1d340 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
1d350 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b  free(p->idxStr);
1d360 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1d370 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b  (pParse->db, p);
1d380 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d390 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d3a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1d3b0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  LE */../*.** Add
1d3c0 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
1d3d0 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
1d3e0 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
1d3f0 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
1d400 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
1d410 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
1d420 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1d430 6f 70 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65  opAddOr(.  Where
1d440 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1d450 69 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73  ilder, .  Bitmas
1d460 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20 20 42 69  k mPrereq, .  Bi
1d470 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a  tmask mUnusable.
1d480 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1d490 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1d4a0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65  r->pWInfo;.  Whe
1d4b0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
1d4c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
1d4d0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
1d4e0 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20  Term, *pWCEnd;. 
1d4f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d500 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  _OK;.  int iCur;
1d510 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  .  WhereClause t
1d520 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f  empWC;.  WhereLo
1d530 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75  opBuilder sSubBu
1d540 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65  ild;.  WhereOrSe
1d550 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20  t sSum, sCur;.  
1d560 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d570 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
1d580 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
1d590 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d  >pWC;.  pWCEnd =
1d5a0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
1d5b0 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
1d5c0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1d5d0 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30   memset(&sSum, 0
1d5e0 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b  , sizeof(sSum));
1d5f0 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
1d600 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
1d610 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
1d620 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
1d630 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65  rsor;..  for(pTe
1d640 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
1d650 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53  <pWCEnd && rc==S
1d660 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b  QLITE_OK; pTerm+
1d670 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
1d680 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d690 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26  WO_OR)!=0.     &
1d6a0 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
1d6b0 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
1d6c0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29   pNew->maskSelf)
1d6d0 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
1d6e0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
1d6f0 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
1d700 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1d710 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
1d720 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
1d730 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
1d740 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
1d750 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1d760 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
1d770 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
1d780 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
1d790 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75     .      sSubBu
1d7a0 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b  ild = *pBuilder;
1d7b0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1d7c0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
1d7d0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1d7e0 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a  OrSet = &sCur;..
1d7f0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1d800 28 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20  (0x200, ("Begin 
1d810 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c  processing OR-cl
1d820 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72  ause %p\n", pTer
1d830 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  m));.      for(p
1d840 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
1d850 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
1d860 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
1d870 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
1d880 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1d890 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
1d8a0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
1d8b0 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
1d8c0 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
1d8d0 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
1d8e0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
1d8f0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
1d900 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
1d910 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  WC.pWInfo = pWC-
1d920 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  >pWInfo;.       
1d930 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72     tempWC.pOuter
1d940 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
1d950 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
1d960 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
1d970 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
1d980 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1d990 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
1d9a0 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
1d9b0 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
1d9c0 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
1d9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
1d9e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
1d9f0 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d          sCur.n =
1da00 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45   0;.#ifdef WHERE
1da10 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
1da20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1da30 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72  (0x200, ("OR-ter
1da40 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25  m %d of %p has %
1da50 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20  d subterms:\n", 
1da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1da70 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72      (int)(pOrTer
1da80 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65  m-pOrWC->a), pTe
1da90 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57  rm, sSubBuild.pW
1daa0 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20  C->nTerm));.    
1dab0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
1dac0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30  hereTrace & 0x40
1dad0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1dae0 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
1daf0 65 50 72 69 6e 74 28 73 53 75 62 42 75 69 6c 64  ePrint(sSubBuild
1db00 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  .pWC);.        }
1db10 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
1db20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1db30 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
1db40 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1db50 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
1db60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1db70 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1db80 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50  l(&sSubBuild, mP
1db90 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65  rereq, mUnusable
1dba0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1dbb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1dbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1dbd0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
1dbe0 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  ee(&sSubBuild, m
1dbf0 50 72 65 72 65 71 29 3b 0a 20 20 20 20 20 20 20  Prereq);.       
1dc00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1dc10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dc20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1dc30 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73  hereLoopAddOr(&s
1dc40 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65  SubBuild, mPrere
1dc50 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1dc60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dc70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1dc80 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e  ITE_OK || sCur.n
1dc90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
1dca0 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a  f( sCur.n==0 ){.
1dcb0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
1dcc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1dcd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1dce0 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b  else if( once ){
1dcf0 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1dd00 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73  OrMove(&sSum, &s
1dd10 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
1dd20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
1dd30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dd40 20 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 50     WhereOrSet sP
1dd50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77  rev;.          w
1dd60 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65  hereOrMove(&sPre
1dd70 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20  v, &sSum);.     
1dd80 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
1dd90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1dda0 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69  =0; i<sPrev.n; i
1ddb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1ddc0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72   for(j=0; j<sCur
1ddd0 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; j++){.      
1dde0 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49          whereOrI
1ddf0 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72  nsert(&sSum, sPr
1de00 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c  ev.a[i].prereq |
1de10 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65   sCur.a[j].prere
1de20 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1de40 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1de50 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c  sPrev.a[i].rRun,
1de60 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29   sCur.a[j].rRun)
1de70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1de90 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73  lite3LogEstAdd(s
1dea0 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20  Prev.a[i].nOut, 
1deb0 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29  sCur.a[j].nOut))
1dec0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1ded0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1def0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
1df00 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 1;.      pNew
1df10 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
1df20 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  erm;.      pNew-
1df30 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1df40 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
1df50 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1df60 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  0;.      pNew->i
1df70 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
1df80 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d     memset(&pNew-
1df90 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e  >u, 0, sizeof(pN
1dfa0 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66  ew->u));.      f
1dfb0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1dfc0 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e  TE_OK && i<sSum.
1dfd0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1dfe0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72   /* TUNING: Curr
1dff0 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e  ently sSum.a[i].
1e000 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74  rRun is set to t
1e010 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f  he sum of the co
1e020 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  sts.        ** o
1e030 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20  f all sub-scans 
1e040 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1e050 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72  OR-scan. However
1e060 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e  , due to roundin
1e070 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72  g.        ** err
1e080 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74  ors, it may be t
1e090 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hat the cost of 
1e0a0 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65  the OR-scan is e
1e0b0 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20  qual to its.    
1e0c0 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65      ** most expe
1e0d0 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20  nsive sub-scan. 
1e0e0 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  Add the smallest
1e0f0 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74   possible penalt
1e100 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65  y .        ** (e
1e110 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c  quivalent to mul
1e120 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73  tiplying the cos
1e130 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e  t by 1.07) to en
1e140 73 75 72 65 20 74 68 61 74 20 0a 20 20 20 20 20  sure that .     
1e150 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20     ** this does 
1e160 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65  not happen. Othe
1e170 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45  rwise, for WHERE
1e180 20 63 6c 61 75 73 65 73 20 73 75 63 68 20 61 73   clauses such as
1e190 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1e1a0 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20  following where 
1e1b0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1e1c0 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20  x on "y":.      
1e1d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e1e0 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69      WHERE likeli
1e1f0 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20  hood(x=?, 0.99) 
1e200 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a  OR y=?.        *
1e210 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
1e220 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65   planner may ele
1e230 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74  ct to "OR" toget
1e240 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65  her a full-table
1e250 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20   scan and an.   
1e260 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f       ** index lo
1e270 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20  okup. And other 
1e280 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65  similarly odd re
1e290 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  sults.  */.     
1e2a0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1e2b0 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b  sSum.a[i].rRun +
1e2c0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
1e2d0 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b  ->nOut = sSum.a[
1e2e0 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  i].nOut;.       
1e2f0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
1e300 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sSum.a[i].prereq
1e310 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
1e320 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1e330 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1e340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48        }.      WH
1e350 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1e360 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67  ("End processing
1e370 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
1e380 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d  , pTerm));.    }
1e390 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e3a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1e3b0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
1e3c0 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62  ects for all tab
1e3d0 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les .*/.static i
1e3e0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41  nt whereLoopAddA
1e3f0 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ll(WhereLoopBuil
1e400 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
1e410 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1e420 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1e430 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73  pWInfo;.  Bitmas
1e440 6b 20 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a 20  k mPrereq = 0;. 
1e450 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20   Bitmask mPrior 
1e460 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
1e470 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1e480 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
1e490 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
1e4a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e4b0 70 49 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20  pItem;.  struct 
1e4c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45  SrcList_item *pE
1e4d0 6e 64 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  nd = &pTabList->
1e4e0 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
1e4f0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ];.  sqlite3 *db
1e500 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1e510 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  e->db;.  int rc 
1e520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57  = SQLITE_OK;.  W
1e530 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
1e540 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79    u8 priorJointy
1e550 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f  pe = 0;..  /* Lo
1e560 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
1e570 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
1e580 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1e590 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70  ht */.  pNew = p
1e5a0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1e5b0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70   whereLoopInit(p
1e5c0 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62  New);.  for(iTab
1e5d0 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69  =0, pItem=pTabLi
1e5e0 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e  st->a; pItem<pEn
1e5f0 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d  d; iTab++, pItem
1e600 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ++){.    Bitmask
1e610 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a   mUnusable = 0;.
1e620 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
1e630 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
1e640 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69  >maskSelf = sqli
1e650 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1e660 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
1e670 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  t, pItem->iCurso
1e680 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49  r);.    if( ((pI
1e690 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
1e6a0 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20  |priorJointype) 
1e6b0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
1e6c0 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
1e6d0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74    /* This condit
1e6e0 69 6f 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e  ion is true when
1e6f0 20 70 49 74 65 6d 20 69 73 20 74 68 65 20 46 52   pItem is the FR
1e700 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f  OM clause term o
1e710 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  n the.      ** r
1e720 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  ight-hand-side o
1e730 66 20 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53  f a LEFT or CROS
1e740 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20  S JOIN.  */.    
1e750 20 20 6d 50 72 65 72 65 71 20 3d 20 6d 50 72 69    mPrereq = mPri
1e760 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  or;.    }.    pr
1e770 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49  iorJointype = pI
1e780 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
1e790 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e7a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1e7b0 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
1e7c0 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
1e7d0 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ) ){.      struc
1e7e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e7f0 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26  p;.      for(p=&
1e800 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64  pItem[1]; p<pEnd
1e810 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; p++){.        
1e820 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c  if( mUnusable ||
1e830 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65   (p->fg.jointype
1e840 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
1e850 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20  ROSS)) ){.      
1e860 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d      mUnusable |=
1e870 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
1e880 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
1e890 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73  askSet, p->iCurs
1e8a0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
1e8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1e8c0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1e8d0 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20  rtual(pBuilder, 
1e8e0 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62  mPrereq, mUnusab
1e8f0 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  le);.    }else.#
1e900 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e910 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e920 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20  E */.    {.     
1e930 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1e940 64 64 42 74 72 65 65 28 70 42 75 69 6c 64 65 72  ddBtree(pBuilder
1e950 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20  , mPrereq);.    
1e960 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1e970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e980 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1e990 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d  ddOr(pBuilder, m
1e9a0 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
1e9b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  e);.    }.    mP
1e9c0 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
1e9d0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
1e9e0 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
1e9f0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
1ea00 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70    }..  whereLoop
1ea10 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b  Clear(db, pNew);
1ea20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ea30 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
1ea40 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68   WherePath (with
1ea50 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
1ea60 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65   the extra Where
1ea70 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a  Loop of the 5th.
1ea80 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74  ** parameters) t
1ea90 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70  o see if it outp
1eaa0 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20  uts rows in the 
1eab0 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20  requested ORDER 
1eac0 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20  BY.** (or GROUP 
1ead0 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75  BY) without requ
1eae0 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65  iring a separate
1eaf0 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e   sort operation.
1eb00 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a    Return N:.** .
1eb10 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65  **   N>0:   N te
1eb20 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1eb30 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
1eb40 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d  atisfied.**   N=
1eb50 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66  =0:  No terms of
1eb60 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1eb70 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
1eb80 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55  ed.**   N<0:   U
1eb90 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d  nknown yet how m
1eba0 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44  any terms of ORD
1ebb0 45 52 20 42 59 20 6d 69 67 68 74 20 62 65 20 73  ER BY might be s
1ebc0 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a  atisfied.   .**.
1ebd0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f  ** Note that pro
1ebe0 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52  cessing for WHER
1ebf0 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48  E_GROUPBY and WH
1ec00 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69  ERE_DISTINCTBY i
1ec10 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69  s not as.** stri
1ec20 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20  ct.  With GROUP 
1ec30 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
1ec40 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65  the only require
1ec50 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20  ment is that.** 
1ec60 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
1ec70 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65  appear immediate
1ec80 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f  ly adjacent to o
1ec90 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f  ne another.  GRO
1eca0 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53  UP BY.** and DIS
1ecb0 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71  TINCT do not req
1ecc0 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70  uire rows to app
1ecd0 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69  ear in any parti
1ece0 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c  cular order as l
1ecf0 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 61  ong.** as equiva
1ed00 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72  lent rows are gr
1ed10 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20  ouped together. 
1ed20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20   Thus for GROUP 
1ed30 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a  BY and DISTINCT.
1ed40 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  ** the pOrderBy 
1ed50 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74  terms can be mat
1ed60 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65  ched in any orde
1ed70 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42  r.  With ORDER B
1ed80 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65  Y, the .** pOrde
1ed90 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62  rBy terms must b
1eda0 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72  e matched in str
1edb0 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68  ict left-to-righ
1edc0 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  t order..*/.stat
1edd0 69 63 20 69 38 20 77 68 65 72 65 50 61 74 68 53  ic i8 wherePathS
1ede0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
1edf0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1ee00 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20  Info,    /* The 
1ee10 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1ee20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1ee30 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52  erBy,   /* ORDER
1ee40 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
1ee50 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75  or DISTINCT clau
1ee60 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  se to check */. 
1ee70 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74   WherePath *pPat
1ee80 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  h,     /* The Wh
1ee90 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b  erePath to check
1eea0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
1eeb0 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 57  lags,       /* W
1eec0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20  HERE_GROUPBY or 
1eed0 5f 44 49 53 54 49 4e 43 54 42 59 20 6f 72 20 5f  _DISTINCTBY or _
1eee0 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 2a 2f  ORDERBY_LIMIT */
1eef0 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
1ef00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ef10 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1ef20 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
1ef30 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1ef40 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
1ef50 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
1ef60 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
1ef70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
1ef80 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
1ef90 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
1efa0 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
1efb0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
1efc0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
1efd0 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
1efe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1eff0 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
1f000 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f020 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
1f030 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
1f040 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1f050 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
1f060 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
1f070 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
1f080 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
1f090 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
1f0a0 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
1f0b0 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
1f0c0 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
1f0d0 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
1f0e0 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
1f0f0 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
1f100 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
1f110 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
1f120 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
1f130 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f140 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f 70 4d 61   */.  u16 eqOpMa
1f150 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  sk;         /* A
1f160 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69 74 79 20  llowed equality 
1f170 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75  operators */.  u
1f180 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  16 nKeyCol;     
1f190 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f1a0 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e  f key columns in
1f1b0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36   pIndex */.  u16
1f1c0 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
1f1d0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1f1e0 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f  er of ordered co
1f1f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
1f200 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64  ex */.  u16 nOrd
1f210 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
1f220 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e   Number terms in
1f230 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1f240 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1f250 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
1f260 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72  /* Index of Wher
1f270 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62  eLoop in pPath b
1f280 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a  eing processed *
1f290 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
1f2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1f2b0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1f2c0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1f2d0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1f2e0 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65  number for curre
1f2f0 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  nt WhereLoop */.
1f300 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
1f310 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
1f320 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
1f330 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a  n table iCur */.
1f340 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1f350 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65  op = 0; /* Curre
1f360 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69  nt WhereLoop bei
1f370 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f  ng processed. */
1f380 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1f390 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69  erm;     /* A si
1f3a0 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
1f3b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1f3c0 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72  .  Expr *pOBExpr
1f3d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ;        /* An e
1f3e0 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
1f3f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1f400 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  se */.  CollSeq 
1f410 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  *pColl;       /*
1f420 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f   COLLATE functio
1f430 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20  n from an ORDER 
1f440 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  BY clause term *
1f450 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
1f460 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x;        /* The
1f470 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
1f480 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a  d with pLoop */.
1f490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f4a0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1f4b0 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
1f4c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f4d0 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d   Bitmask obSat =
1f4e0 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f   0;    /* Mask o
1f4f0 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
1f500 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61   satisfied so fa
1f510 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  r */.  Bitmask o
1f520 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20  bDone;       /* 
1f530 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45  Mask of all ORDE
1f540 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
1f550 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73  Bitmask orderDis
1f560 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d  tinctMask;  /* M
1f570 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d  ask of all well-
1f580 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f  ordered loops */
1f590 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79  .  Bitmask ready
1f5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f5b0 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20  * Mask of inner 
1f5c0 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  loops */..  /*. 
1f5d0 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
1f5e0 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65  hereLoop is "one
1f5f0 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65  -row" if it gene
1f600 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68  rates no more th
1f610 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20  an one.  ** row 
1f620 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68  of output.  A Wh
1f630 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72  ereLoop is one-r
1f640 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ow if all of the
1f650 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1f660 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41  rue:.  **  (a) A
1f670 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
1f680 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52   match with WHER
1f690 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a  E_COLUMN_EQ..  *
1f6a0 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78  *  (b) The index
1f6b0 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20   is unique.  ** 
1f6c0 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  Any WhereLoop wi
1f6d0 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55  th an WHERE_COLU
1f6e0 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  MN_EQ constraint
1f6f0 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73   on the rowid is
1f700 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45   one-row..  ** E
1f710 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
1f720 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65  reLoop will have
1f730 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1f740 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46  W bit set in wsF
1f750 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lags..  **.  ** 
1f760 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
1f770 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64  Loop is "order-d
1f780 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20  istinct" if the 
1f790 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  set of columns f
1f7a0 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68  rom.  ** that Wh
1f7b0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65  ereLoop that are
1f7c0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1f7d0 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66   clause are diff
1f7e0 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a  erent for every.
1f7f0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1f800 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72  WhereLoop.  Ever
1f810 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
1f820 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63  oop is automatic
1f830 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d  ally.  ** order-
1f840 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68  distinct.   A Wh
1f850 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73  ereLoop that has
1f860 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   no columns in t
1f870 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1f880 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f  se.  ** is not o
1f890 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54  rder-distinct. T
1f8a0 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
1f8b0 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65  nct is not quite
1f8c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69   the same as bei
1f8d0 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73  ng.  ** UNIQUE s
1f8e0 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f  ince a UNIQUE co
1f8f0 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61  lumn or index ca
1f900 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
1f910 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20  rows that .  ** 
1f920 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c  are NULL and NUL
1f930 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75  L values are equ
1f940 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20  ivalent for the 
1f950 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72  purpose of order
1f960 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20  -distinct..  ** 
1f970 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
1f980 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e  inct, the column
1f990 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45  s must be UNIQUE
1f9a0 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20   and NOT NULL.. 
1f9b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77   **.  ** The row
1f9c0 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69  id for a table i
1f9d0 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20  s always UNIQUE 
1f9e0 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20  and NOT NULL so 
1f9f0 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a  whenever the.  *
1fa00 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20  * rowid appears 
1fa10 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1fa20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72  clause, the corr
1fa30 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c  esponding WhereL
1fa40 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f  oop is.  ** auto
1fa50 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d  matically order-
1fa60 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a  distinct..  */..
1fa70 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
1fa80 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  By!=0 );.  if( n
1fa90 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  Loop && Optimiza
1faa0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1fab0 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
1fac0 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  dxJoin) ) return
1fad0 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20   0;..  nOrderBy 
1fae0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
1faf0 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
1fb00 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29  OrderBy==BMS-1 )
1fb10 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
1fb20 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20  >BMS-1 ) return 
1fb30 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70  0;  /* Cannot op
1fb40 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61  timize overly la
1fb50 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f  rge ORDER BYs */
1fb60 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  .  isOrderDistin
1fb70 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65  ct = 1;.  obDone
1fb80 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65   = MASKBIT(nOrde
1fb90 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44  rBy)-1;.  orderD
1fba0 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b  istinctMask = 0;
1fbb0 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20  .  ready = 0;.  
1fbc0 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  eqOpMask = WO_EQ
1fbd0 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f 5f 49 53   | WO_IS | WO_IS
1fbe0 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77 63 74 72  NULL;.  if( wctr
1fbf0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1fc00 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20 65  RDERBY_LIMIT ) e
1fc10 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e  qOpMask |= WO_IN
1fc20 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  ;.  for(iLoop=0;
1fc30 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1fc40 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65   && obSat<obDone
1fc50 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70   && iLoop<=nLoop
1fc60 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
1fc70 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65  if( iLoop>0 ) re
1fc80 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ady |= pLoop->ma
1fc90 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
1fca0 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20  iLoop<nLoop ){. 
1fcb0 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 50 61       pLoop = pPa
1fcc0 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  th->aLoop[iLoop]
1fcd0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 63 74 72  ;.      if( wctr
1fce0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1fcf0 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 20 63  RDERBY_LIMIT ) c
1fd00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c  ontinue;.    }el
1fd10 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20  se{.      pLoop 
1fd20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20  = pLast;.    }. 
1fd30 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1fd40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1fd50 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
1fd60 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75      if( pLoop->u
1fd70 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
1fd80 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65  ) obSat = obDone
1fd90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fda0 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
1fdb0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1fdc0 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
1fdd0 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
1fde0 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
1fdf0 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
1fe00 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
1fe10 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
1fe20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
1fe30 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
1fe40 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
1fe50 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
1fe60 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
1fe70 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
1fe80 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
1fe90 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
1fea0 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
1feb0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1fec0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
1fed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1fee0 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
1fef0 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
1ff00 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
1ff10 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1ff20 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
1ff30 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1ff40 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1ff50 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
1ff60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ff70 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
1ff80 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
1ff90 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
1ffa0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
1ffb0 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
1ffc0 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
1ffd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71        ~ready, eq
20000 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20  OpMask, 0);.    
20010 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
20020 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20030 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
20040 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a  rator==WO_IN ){.
20050 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65          /* IN te
20060 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c  rms are only val
20070 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69  id for sorting i
20080 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c  n the ORDER BY L
20090 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a  IMIT .        **
200a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61   optimization, a
200b0 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20  nd then only if 
200c0 74 68 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c  they are actuall
200d0 79 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  y used.        *
200e0 2a 20 62 79 20 74 68 65 20 71 75 65 72 79 20 70  * by the query p
200f0 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  lan */.        a
20100 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
20110 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
20120 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20  Y_LIMIT );.     
20130 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
20140 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
20150 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  Term!=pLoop->aLT
20160 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20  erm[j]; j++){}. 
20170 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c         if( j>=pL
20180 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f  oop->nLTerm ) co
20190 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
201a0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
201b0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
201c0 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
201d0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
201e0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
201f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
20200 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
20210 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
20220 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
20230 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
20240 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20250 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
20260 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
20270 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
20280 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
20290 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
202a0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
202b0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
202c0 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
202d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
202e0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
202f0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
20300 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
20310 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
20320 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20330 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
20340 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
20350 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20360 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
20370 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
20380 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
20390 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
203a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
203b0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
203c0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
203d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
203e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
203f0 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
20400 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
20410 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
20420 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
20430 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
20440 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
20450 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
20460 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
20470 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
20480 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
20490 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
204a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
204b0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
204c0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
204d0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
204e0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
204f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
20500 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
20510 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20520 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
20530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20540 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20550 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e  n[nColumn-1]==XN
20560 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20590 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
205a0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
205b0 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
205c0 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
205d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
205e0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
205f0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
20600 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
20610 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
20620 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
20630 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
20640 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
20650 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
20660 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
20670 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
20680 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
20690 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
206a0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
206b0 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b     u8 bOnce = 1;
206c0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
206d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
206e0 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
206f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d       assert( j>=
20700 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
20710 45 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Eq .            
20720 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  || (pLoop->aLTer
20730 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f  m[j]==0)==(j<pLo
20740 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20  op->nSkip).     
20750 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
20760 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
20770 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f  ee.nEq && j>=pLo
20780 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  op->nSkip ){.   
20790 20 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d         u16 eOp =
207a0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
207b0 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20  ]->eOperator;.. 
207c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
207d0 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
207e0 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73  and ISNULL terms
207f0 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e  .  (Also skip IN
20800 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20   terms when.    
20810 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57        ** doing W
20820 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
20830 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20  IT processing). 
20840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
20850 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
20860 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
20870 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  s a column of an
20880 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45   ((?,?) IN (SELE
20890 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20  CT...)) .       
208a0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
208b0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53   for which the S
208c0 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f  ELECT returns mo
208d0 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
208e0 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mn,.          **
208f0 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
20900 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d  s the only colum
20910 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c  n used by this l
20920 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  oop. Otherwise,.
20930 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
20940 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f  it is one of two
20950 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f   or more, none o
20960 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61  f the columns ca
20970 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  n be.          *
20980 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
20990 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42  match an ORDER B
209a0 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  Y term.  */.    
209b0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
209c0 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b   eqOpMask)!=0 ){
209d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
209e0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
209f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20a00 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
20a10 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
20a30 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
20a40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
20a50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
20a60 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
20a70 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
20a80 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  YS(eOp & WO_IN) 
20a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
20aa0 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69  * ALWAYS() justi
20ab0 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73  fication: eOp is
20ac0 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65   an equality ope
20ad0 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65  rator due to the
20ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
20af0 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
20b00 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20  .nEq constraint 
20b10 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61  above.  Any equa
20b20 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20  lity other.     
20b30 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57         ** than W
20b40 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64  O_IN is captured
20b50 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
20b60 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20   "if".  So this 
20b70 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
20b80 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f  ** always has to
20b90 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20   be WO_IN. */.  
20ba0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
20bb0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
20bc0 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20  rm[j]->pExpr;.  
20bd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
20be0 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e  j+1; i<pLoop->u.
20bf0 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b  btree.nEq; i++){
20c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20c10 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  f( pLoop->aLTerm
20c20 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29  [i]->pExpr==pX )
20c30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
20c40 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
20c50 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70  ->aLTerm[i]->eOp
20c60 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20  erator & WO_IN) 
20c70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
20c80 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20     bOnce = 0;.  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
20ca0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
20cb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20cc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
20cd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20ce0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
20cf0 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
20d00 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
20d10 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
20d20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
20d30 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
20d40 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
20d50 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
20d60 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
20d70 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
20d80 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
20d90 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
20da0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
20db0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
20dc0 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
20dd0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
20de0 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
20df0 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
20e00 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
20e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20e20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f   iColumn = XN_RO
20e30 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72  WID;.          r
20e40 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
20e50 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
20e60 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
20e70 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
20e80 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
20e90 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
20ea0 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
20eb0 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
20ec0 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
20ed0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
20ee0 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
20ef0 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
20f00 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
20f10 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
20f20 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
20f30 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
20f40 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
20f50 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
20f60 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
20f70 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
20f80 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
20f90 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
20fa0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
20fb0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
20fc0 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
20fd0 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
20fe0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
20ff0 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
21000 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
21010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21020 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
21030 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
21040 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
21050 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
21060 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
21070 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
21080 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21090 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
210a0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
210b0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
210c0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
210d0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
210e0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
210f0 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
21100 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
21110 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21120 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
21130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
21140 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
21150 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
21160 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
21170 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
21180 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
21190 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20  umn>=(-1) ){.   
211a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
211b0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
211c0 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
211d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
211e0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
211f0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
21200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21210 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
21220 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
21230 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21250 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21260 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 42 45  ExprCompare(pOBE
21270 78 70 72 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  xpr,pIndex->aCol
21280 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  Expr->a[j].pExpr
21290 2c 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20  ,iCur) ){.      
212a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
212b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
212c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
212d0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
212e0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
212f0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
21300 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
21310 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
21320 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
21330 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
21340 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
21350 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
21360 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
21370 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
21380 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
21390 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
213a0 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
213b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
213c0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
213d0 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
213e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
213f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
21400 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c  sMatch && (wctrl
21410 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
21420 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
21430 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
21440 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
21450 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
21460 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
21470 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
21480 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    ** Sort order 
21490 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  is irrelevant fo
214a0 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
214b0 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  use. */.        
214c0 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
214d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
214e0 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d  (rev ^ revIdx)!=
214f0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
21500 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74  ortOrder ) isMat
21510 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
21520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21530 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64       rev = revId
21540 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x ^ pOrderBy->a[
21550 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
21560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
21570 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d  v ) *pRevMask |=
21580 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b   MASKBIT(iLoop);
21590 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76  .            rev
215a0 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
215b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
215c0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
215d0 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
215e0 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
215f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
21600 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43  tcase( distinctC
21610 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  olumns==0 );.   
21620 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
21630 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20  tColumns = 1;.  
21640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21650 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
21660 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
21670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21680 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
21690 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
216a0 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
216b0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
216c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
216d0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
216e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
216f0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
21700 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
21710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
21720 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
21730 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
21740 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
21750 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
21760 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
21770 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
21780 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
21790 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
217a0 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
217b0 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
217c0 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
217d0 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
217e0 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
217f0 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
21800 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
21810 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
21820 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
21830 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
21840 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
21850 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
21860 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
21870 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21880 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
21890 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
218a0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
218b0 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  mTerm;.        i
218c0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
218d0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
218e0 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
218f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
21900 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72  pr;.        mTer
21910 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
21920 45 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66  ExprUsage(&pWInf
21930 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
21940 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
21950 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
21960 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
21970 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
21980 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
21990 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
219a0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
219b0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
219c0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
219d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
219e0 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
219f0 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
21a00 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
21a10 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
21a20 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
21a30 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
21a40 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
21a50 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
21a60 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
21a70 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
21a80 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
21a90 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
21aa0 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
21ab0 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
21ac0 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
21ad0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
21ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
21af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
21b00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
21b10 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
21b20 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
21b30 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
21b40 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
21b50 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
21b60 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
21b70 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
21b80 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
21b90 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
21ba0 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
21bb0 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
21bc0 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
21bd0 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
21be0 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
21bf0 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
21c00 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
21c10 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
21c20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
21c30 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
21c40 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
21c50 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
21c60 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
21c70 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
21c80 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
21c90 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
21ca0 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
21cb0 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
21cc0 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
21cd0 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
21ce0 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
21cf0 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
21d00 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
21d10 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
21d20 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
21d30 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
21d40 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
21d50 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
21d60 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
21d70 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
21d80 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
21d90 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
21da0 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
21db0 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
21dc0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
21dd0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
21de0 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
21df0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
21e00 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
21e10 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
21e20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
21e30 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
21e40 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
21e50 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
21e60 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
21e70 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
21e80 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
21e90 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
21ea0 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
21eb0 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
21ec0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
21ed0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
21ee0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
21ef0 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
21f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
21f10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
21f20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
21f30 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
21f40 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
21f50 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
21f60 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
21f70 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
21f80 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
21f90 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
21fa0 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
21fb0 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
21fc0 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
21fd0 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
21fe0 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
21ff0 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
22000 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
22010 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
22020 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
22030 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
22040 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
22050 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
22060 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
22070 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
22080 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22090 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73  * Return the cos
220a0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
220b0 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67  w rows, assuming
220c0 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68   that the keys h
220d0 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79  ave .** nOrderby
220e0 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61   columns and tha
220f0 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72  t the first nSor
22100 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
22110 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72  already in.** or
22120 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  der..*/.static L
22130 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69  ogEst whereSorti
22140 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49  ngCost(.  WhereI
22150 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c  nfo *pWInfo,.  L
22160 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e  ogEst nRow,.  in
22170 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e  t nOrderBy,.  in
22180 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f  t nSorted.){.  /
22190 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
221a0 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75  ted cost of a fu
221b0 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  ll external sort
221c0 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20  , where N is .  
221d0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
221e0 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
221f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
22200 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
22210 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20  log(N))..  ** . 
22220 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
22230 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
22240 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
22250 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
22260 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
22270 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
22280 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
22290 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
222a0 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f  .  ** sorting co
222b0 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  st to:.  **.  **
222c0 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
222d0 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
222e0 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Y/X).  **.  ** T
222f0 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73  he (Y/X) term is
22300 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
22310 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ng stack variabl
22320 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65  e rScale.  ** be
22330 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73  low.  */.  LogEs
22340 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
22350 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ost;.  assert( n
22360 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
22370 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
22380 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20  00) );.  rScale 
22390 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
223a0 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65  (nOrderBy-nSorte
223b0 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29  d)*100/nOrderBy)
223c0 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f   - 66;.  rSortCo
223d0 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61  st = nRow + rSca
223e0 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d  le + 16;..  /* M
223f0 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d  ultiple by log(M
22400 29 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65  ) where M is the
22410 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
22420 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65  t rows..  ** Use
22430 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d   the LIMIT for M
22440 20 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65   if it is smalle
22450 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e  r */.  if( (pWIn
22460 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22470 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
22480 29 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e  )!=0 && pWInfo->
22490 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20  iLimit<nRow ){. 
224a0 20 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f     nRow = pWInfo
224b0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  ->iLimit;.  }.  
224c0 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74  rSortCost += est
224d0 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74  Log(nRow);.  ret
224e0 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d  urn rSortCost;.}
224f0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
22500 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
22510 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
22520 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
22530 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
22540 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
22550 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
22560 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
22570 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
22580 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
22590 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
225a0 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
225b0 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
225c0 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
225d0 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
225e0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
225f0 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
22600 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
22610 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
22620 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
22630 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
22640 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
22650 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
22660 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
22670 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
22680 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
22690 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
226a0 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
226b0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
226c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
226d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
226e0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
226f0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
22700 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b  LogEst nRowEst){
22710 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b  .  int mxChoice;
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22730 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
22740 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70  f simultaneous p
22750 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a  aths tracked */.
22760 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20    int nLoop;    
22770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22780 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
22790 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
227a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
227b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
227c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
227d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
227e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
227f0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
22800 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
22810 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
22820 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22830 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74  unter over the t
22840 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  erms of the join
22850 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a   */.  int ii, jj
22860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22870 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
22880 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20   */.  int mxI = 
22890 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
228a0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
228b0 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63   entry to replac
228c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
228d0 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rBy;            
228e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
228f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
22900 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  rms */.  LogEst 
22910 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20  mxCost = 0;     
22920 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f     /* Maximum co
22930 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70  st of a set of p
22940 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  aths */.  LogEst
22950 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b   mxUnsorted = 0;
22960 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75      /* Maximum u
22970 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
22980 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f  a set of path */
22990 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
229a0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
229b0 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
229c0 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
229d0 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
229e0 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
229f0 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
22a00 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
22a10 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
22a20 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
22a30 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
22a40 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
22a50 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
22a60 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
22a70 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
22a80 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
22a90 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
22aa0 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
22ab0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
22ac0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
22ad0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
22ae0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
22af0 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
22b00 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
22b10 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
22b20 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
22b30 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
22b40 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
22b50 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
22b60 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
22b70 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
22b80 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
22b90 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74  .  LogEst *aSort
22ba0 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Cost = 0;    /* 
22bb0 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74  Sorting and part
22bc0 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74  ial sorting cost
22bd0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  s */.  char *pSp
22be0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
22bf0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
22c00 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
22c10 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  s routine */.  i
22c20 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20  nt nSpace;      
22c30 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
22c40 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
22c50 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a  ated at pSpace *
22c60 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
22c70 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
22c80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22c90 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  .  nLoop = pWInf
22ca0 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20  o->nLevel;.  /* 
22cb0 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70  TUNING: For simp
22cc0 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79  le queries, only
22cd0 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69   the best path i
22ce0 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20  s tracked..  ** 
22cf0 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c  For 2-way joins,
22d00 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68   the 5 best path
22d10 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a  s are followed..
22d20 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f    ** For joins o
22d30 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c  f 3 or more tabl
22d40 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30  es, track the 10
22d50 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20   best paths */. 
22d60 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f   mxChoice = (nLo
22d70 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c  op<=1) ? 1 : (nL
22d80 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29  oop==2 ? 5 : 10)
22d90 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  ;.  assert( nLoo
22da0 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  p<=pWInfo->pTabL
22db0 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57  ist->nSrc );.  W
22dc0 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
22dd0 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f   ("---- begin so
22de0 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d  lver.  (nRowEst=
22df0 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29  %d)\n", nRowEst)
22e00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77  );..  /* If nRow
22e10 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  Est is zero and 
22e20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
22e30 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e  R BY clause, ign
22e40 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a  ore it. In this.
22e50 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75    ** case the pu
22e60 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
22e70 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74  ll is to estimat
22e80 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
22e90 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20  rows returned.  
22ea0 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c  ** by the overal
22eb0 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68  l query. Once th
22ec0 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20  is estimate has 
22ed0 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
22ee0 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77  he caller.  ** w
22ef0 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  ill invoke this 
22f00 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e  function a secon
22f10 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20  d time, passing 
22f20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20  the estimate as 
22f30 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74  the.  ** nRowEst
22f40 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a   parameter.  */.
22f50 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
22f60 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
22f70 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  wEst==0 ){.    n
22f80 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
22f90 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72  else{.    nOrder
22fa0 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  By = pWInfo->pOr
22fb0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
22fc0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
22fd0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
22fe0 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61  space for aTo, a
22ff0 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f  From and aSortCo
23000 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65  st[] */.  nSpace
23010 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
23020 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
23030 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
23040 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53  mxChoice*2;.  nS
23050 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c  pace += sizeof(L
23060 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42  ogEst) * nOrderB
23070 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71  y;.  pSpace = sq
23080 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
23090 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a  NN(db, nSpace);.
230a0 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20    if( pSpace==0 
230b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
230c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54  NOMEM_BKPT;.  aT
230d0 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
230e0 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
230f0 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
23100 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
23110 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
23120 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
23130 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
23140 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
23150 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
23160 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
23170 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
23180 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
23190 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
231a0 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = pX;.  }.  if( 
231b0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
231c0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
231d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
231e0 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  e and it is not 
231f0 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73  being ignored, s
23200 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61  et up.    ** spa
23210 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74  ce for the aSort
23220 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61  Cost[] array. Ea
23230 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ch element of th
23240 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61  e aSortCost arra
23250 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  y.    ** is eith
23260 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e  er zero - meanin
23270 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74  g it has not yet
23280 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
23290 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  d - or the.    *
232a0 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  * cost of sortin
232b0 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f  g nRowEst rows o
232c0 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65  f data where the
232d0 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f   first X terms o
232e0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44  f.    ** the ORD
232f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
23300 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65   already in orde
23310 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68  r, where X is th
23320 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20  e array .    ** 
23330 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61  index.  */.    a
23340 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45  SortCost = (LogE
23350 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73  st*)pX;.    mems
23360 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c  et(aSortCost, 0,
23370 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
23380 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  * nOrderBy);.  }
23390 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
233a0 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61  Cost==0 || &pSpa
233b0 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
233c0 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f  r*)&aSortCost[nO
233d0 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73  rderBy] );.  ass
233e0 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d  ert( aSortCost!=
233f0 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
23400 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20  ace]==(char*)pX 
23410 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68  );..  /* Seed th
23420 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
23430 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
23440 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
23450 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
23460 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
23470 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
23480 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
23490 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20  ns go above 28. 
234a0 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
234b0 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
234c0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
234d0 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
234e0 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
234f0 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73  rst 28.  ** rows
23500 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
23510 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
23520 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
23530 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
23540 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
23550 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74  op, 48);  assert
23560 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 48==sqlite3Log
23570 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72  Est(28) );.  nFr
23580 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  om = 1;.  assert
23590 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64  ( aFrom[0].isOrd
235a0 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ered==0 );.  if(
235b0 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
235c0 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20   /* If nLoop is 
235d0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
235e0 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72   are no FROM ter
235f0 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ms in the query.
23600 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e   Since.    ** in
23610 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71   this case the q
23620 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20  uery may return 
23630 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65  a maximum of one
23640 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74   row, the result
23650 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72  s.    ** are alr
23660 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75  eady in the requ
23670 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74  ested order. Set
23680 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f   isOrdered to nO
23690 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a  rderBy to.    **
236a0 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20   indicate this. 
236b0 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20  Or, if nLoop is 
236c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
236d0 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64  o, set isOrdered
236e0 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69   to.    ** -1, i
236f0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
23700 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61  he result set ma
23710 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
23720 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a  ordered, .    **
23730 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
23740 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f  e loops added to
23750 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61   the current pla
23760 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d  n.  */.    aFrom
23770 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
23780 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e  nLoop>0 ? -1 : n
23790 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20  OrderBy;.  }..  
237a0 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
237b0 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
237c0 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
237d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
237e0 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
237f0 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
23800 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
23810 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
23820 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
23830 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
23840 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
23850 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
23860 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
23870 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
23880 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
23890 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
238a0 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
238b0 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
238c0 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
238d0 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
238e0 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
238f0 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
23900 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45  p){.        LogE
23910 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23930 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   Rows visited by
23940 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
23950 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
23960 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23980 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46  Cost of path (pF
23990 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
239a0 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55         LogEst rU
239b0 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20  nsorted;        
239c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
239d0 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46  rted cost of (pF
239e0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
239f0 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65         i8 isOrde
23a00 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
23a10 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72  rdered;  /* isOr
23a20 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d  dered for (pFrom
23a30 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
23a40 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
23a50 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
23a60 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
23a70 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20   src visited by 
23a80 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  (..) */.        
23a90 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
23aa0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23ab0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76    /* Mask of rev
23ac0 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72  -order loops for
23ad0 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20   (..) */..      
23ae0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
23af0 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
23b00 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
23b10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23b20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
23b30 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
23b40 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
23b50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23b60 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73   if( (pWLoop->ws
23b70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
23b80 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20  TO_INDEX)!=0 && 
23b90 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29  pFrom->nRow<10 )
23ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
23bb0 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74  o not use an aut
23bc0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20  omatic index if 
23bd0 74 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  the this loop is
23be0 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20   expected.      
23bf0 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65      ** to run le
23c00 73 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e  ss than 2 times.
23c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
23c20 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
23c30 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
23c40 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
23c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23c60 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
23c70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
23c80 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
23c90 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
23ca0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
23cb0 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
23cc0 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
23cd0 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
23ce0 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53  stAdd(pWLoop->rS
23cf0 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75  etup,pWLoop->rRu
23d00 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29  n + pFrom->nRow)
23d10 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  ;.        rUnsor
23d20 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
23d30 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
23d40 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74  , pFrom->rUnsort
23d50 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ed);.        nOu
23d60 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  t = pFrom->nRow 
23d70 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
23d80 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
23d90 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
23da0 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
23db0 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
23dc0 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b  ( isOrdered<0 ){
23dd0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
23de0 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68  ered = wherePath
23df0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
23e00 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
23e30 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
23e40 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e60 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
23e70 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20  p, &revMask);.  
23e80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23e90 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d         revMask =
23ea0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
23eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23ec0 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
23ed0 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64  >=0 && isOrdered
23ee0 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  <nOrderBy ){.   
23ef0 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74         if( aSort
23f00 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d  Cost[isOrdered]=
23f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23f20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
23f30 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f  dered] = whereSo
23f40 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20  rtingCost(.     
23f50 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
23f60 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64  o, nRowEst, nOrd
23f70 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a  erBy, isOrdered.
23f80 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
23f90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23fa0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
23fb0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
23fc0 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f  nsorted, aSortCo
23fd0 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a  st[isOrdered]);.
23fe0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
23ff0 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20  TRACE(0x002,.   
24000 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d             ("---
24010 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
24020 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73   (%d/%d) increas
24030 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25  es cost %3d to %
24040 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  -3d\n",.        
24050 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
24060 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f  [isOrdered], (nO
24070 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64  rderBy-isOrdered
24080 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20  ), nOrderBy, .  
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e               rUn
240a0 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b  sorted, rCost));
240b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
240c0 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
240d0 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
240e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
240f0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
24100 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
24110 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
24120 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20   set of.        
24130 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74  ** mxChoice best
24140 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20  -so-far paths.. 
24150 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
24160 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20    ** First look 
24170 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
24180 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d  path among best-
24190 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20  so-far paths.   
241a0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76       ** that cov
241b0 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  ers the same set
241c0 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
241d0 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
241e0 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ered.        ** 
241f0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63  setting as the c
24200 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64  urrent path cand
24210 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  idate..        *
24220 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
24230 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73   term "((pTo->is
24240 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
24250 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20  d)&0x80)==0" is 
24260 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
24270 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69     ** to (pTo->i
24280 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d  sOrdered==(-1))=
24290 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  =(isOrdered==(-1
242a0 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67  ))" for the rang
242b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
242c0 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72  legal values for
242d0 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e   isOrdered, -1..
242e0 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  64..        */. 
242f0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c         for(jj=0,
24300 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f   pTo=aTo; jj<nTo
24310 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
24320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
24330 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73  o->maskLoop==mas
24340 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20  kNew.           
24350 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65  && ((pTo->isOrde
24360 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30  red^isOrdered)&0
24370 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  x80)==0.        
24380 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
24390 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e   testcase( jj==n
243a0 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  To-1 );.        
243b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
243c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
243d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e  .        if( jj>
243e0 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  =nTo ){.        
243f0 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65    /* None of the
24400 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73   existing best-s
24410 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63  o-far paths matc
24420 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
24430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
24440 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a  ( nTo>=mxChoice.
24450 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72             && (r
24460 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28  Cost>mxCost || (
24470 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26  rCost==mxCost &&
24480 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e   rUnsorted>=mxUn
24490 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20  sorted)).       
244a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
244b0 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
244c0 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f   candidate is no
244d0 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79   better than any
244e0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
244f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
24500 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20  paths currently 
24510 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66  in the best-so-f
24520 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64  ar buffer.  So d
24530 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20  iscard.         
24540 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69     ** this candi
24550 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62  date as not viab
24560 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  le. */.#ifdef WH
24570 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
24580 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
24590 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
245a0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
245b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
245c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
245d0 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
245e0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
245f0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24610 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
24620 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
24630 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
24660 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
24670 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
24680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
24690 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
246a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
246b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
246c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
246d0 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  s it means that 
246e0 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74  the new candidat
246f0 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
24700 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20   ** needs to be 
24710 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
24720 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   of best-so-far 
24730 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20  paths. */.      
24740 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
24750 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
24760 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
24770 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
24780 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
24790 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
247a0 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
247b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
247c0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
247d0 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
247e0 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
247f0 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
24800 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
24810 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
24820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24830 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
24840 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
24850 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
24860 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
24870 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24880 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
24890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
248a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
248b0 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
248c0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
248d0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
248e0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
248f0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
24900 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
24910 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
24920 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
24930 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
24940 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
24950 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
24960 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  f.        }else{
24970 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
24980 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
24990 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61  re if best-so-fa
249a0 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a  r path pTo=aTo[j
249b0 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20  j] covers the.  
249c0 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
249d0 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
249e0 20 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f   has the sam isO
249f0 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61  rdered setting a
24a00 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
24a10 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ** candidate pat
24a20 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  h.  Check to see
24a30 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
24a40 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65  e should replace
24a50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
24a60 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64  o or if the cand
24a70 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20  idate should be 
24a80 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20  skipped */.     
24a90 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
24aa0 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54  ost<rCost || (pT
24ab0 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
24ac0 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
24ad0 75 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ut) ){.#ifdef WH
24ae0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
24af0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
24b00 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
24b10 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
24b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24b30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24b40 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
24b50 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
24b60 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
24b70 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
24b90 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
24ba0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
24bb0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a  ), rCost, nOut,.
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
24be0 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
24bf0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
24c00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24c10 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25  gPrintf("   vs %
24c20 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f  s cost=%-3d,%d o
24c30 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
24c50 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
24c60 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
24c70 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
24c80 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
24c90 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
24ca0 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
24cb0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
24cc0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
24cd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
24ce0 20 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72         /* Discar
24cf0 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  d the candidate 
24d00 70 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65  path from furthe
24d10 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
24d20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  */.            t
24d30 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
24d40 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20  ost==rCost );.  
24d50 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
24d60 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
24d70 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
24d80 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
24d90 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20  rCost+1 );.     
24da0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
24db0 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
24dc0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61  the candidate pa
24dd0 74 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61  th is better tha
24de0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
24df0 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65  ** pTo path.  Re
24e00 70 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74  place pTo with t
24e10 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
24e20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
24e30 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
24e40 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
24e50 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
24e60 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
24e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24e80 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
24e90 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64              "Upd
24ea0 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  ate %s cost=%-3d
24eb0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
24ee0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
24ef0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
24f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24f10 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f    isOrdered>=0 ?
24f20 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a   isOrdered+'0' :
24f30 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
24f40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24f50 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
24f60 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
24f70 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
24f80 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
24f90 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
24fa0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
24fb0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
24fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24fd0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
24fe0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
24ff0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
25000 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
25010 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
25020 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
25030 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
25040 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
25050 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
25060 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
25070 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
25080 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
25090 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
250a0 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
250b0 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
250c0 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
250d0 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  = nOut;.        
250e0 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  pTo->rCost = rCo
250f0 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  st;.        pTo-
25100 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e  >rUnsorted = rUn
25110 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
25120 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
25130 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
25140 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
25150 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
25160 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
25170 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
25180 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
25190 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
251a0 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
251b0 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
251c0 0a 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d  .          mxI =
251d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   0;.          mx
251e0 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43  Cost = aTo[0].rC
251f0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  ost;.          m
25200 78 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b  xUnsorted = aTo[
25210 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  0].nRow;.       
25220 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
25230 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
25240 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
25250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
25260 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
25270 6d 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20  mxCost .        
25280 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43       || (pTo->rC
25290 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70  ost==mxCost && p
252a0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78  To->rUnsorted>mx
252b0 55 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20  Unsorted) .     
252c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
252d0 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
252e0 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20   pTo->rCost;.   
252f0 20 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73             mxUns
25300 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e  orted = pTo->rUn
25310 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
25320 20 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a        mxI = jj;.
25330 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
25340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25360 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
25370 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a  RACE_ENABLED  /*
25380 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20   >=2 */.    if( 
25390 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
253a0 65 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20  e & 0x02 ){.    
253b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
253c0 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72  intf("---- after
253d0 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e   round %d ----\n
253e0 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  ", iLoop);.     
253f0 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61   for(ii=0, pTo=a
25400 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b  To; ii<nTo; ii++
25410 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
25420 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25430 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25  intf(" %s cost=%
25440 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72  -3d nrow=%-3d or
25450 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
25460 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
25470 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
25480 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
25490 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
254a0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
254b0 65 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e  ered>=0 ? (pTo->
254c0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a  isOrdered+'0') :
254d0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
254e0 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
254f0 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>0 ){.         
25500 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25510 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
25520 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
25530 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
25540 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
25550 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25560 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
25570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
25580 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
25590 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
255a0 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
255b0 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
255c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
255d0 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
255e0 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
255f0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
25600 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
25610 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
25620 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
25630 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25640 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
25650 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
25660 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
25670 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
25680 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25690 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
256a0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
256b0 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
256c0 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
256d0 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
256e0 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
256f0 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b  rom;.  for(ii=1;
25700 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29   ii<nFrom; ii++)
25710 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  {.    if( pFrom-
25720 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d  >rCost>aFrom[ii]
25730 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d  .rCost ) pFrom =
25740 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d   &aFrom[ii];.  }
25750 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
25760 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70  o->nLevel==nLoop
25770 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   );.  /* Load th
25780 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
25790 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a  th into pWInfo *
257a0 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
257b0 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
257c0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  oop++){.    Wher
257d0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
257e0 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f   pWInfo->a + iLo
257f0 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  op;.    pLevel->
25800 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20  pWLoop = pWLoop 
25810 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69  = pFrom->aLoop[i
25820 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65  Loop];.    pLeve
25830 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f  l->iFrom = pWLoo
25840 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65  p->iTab;.    pLe
25850 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
25860 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
25870 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
25880 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20  ].iCursor;.  }. 
25890 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
258a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
258b0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
258c0 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
258d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
258e0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29  HERE_DISTINCTBY)
258f0 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f  ==0.   && pWInfo
25900 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
25910 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
25920 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20  .   && nRowEst. 
25930 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
25940 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74  notUsed;.    int
25950 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
25960 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
25970 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
25980 70 44 69 73 74 69 6e 63 74 53 65 74 2c 20 70 46  pDistinctSet, pF
25990 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rom,.           
259a0 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54        WHERE_DIST
259b0 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c  INCTBY, nLoop-1,
259c0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
259d0 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
259e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70  );.    if( rc==p
259f0 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74  WInfo->pDistinct
25a00 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Set->nExpr ){.  
25a10 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
25a20 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
25a30 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
25a40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
25a50 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25a60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
25a70 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
25a80 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
25a90 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Y ){.      if( p
25aa0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d  From->isOrdered=
25ab0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
25ac0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
25ad0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
25ae0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
25af0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
25b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
25b10 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  e{.      pWInfo-
25b20 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d  >nOBSat = pFrom-
25b30 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
25b40 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
25b50 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
25b60 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  op;.      if( pW
25b70 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20  Info->nOBSat<=0 
25b80 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
25b90 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20  o->nOBSat = 0;. 
25ba0 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70         if( nLoop
25bb0 3e 30 20 26 26 20 28 70 46 72 6f 6d 2d 3e 61 4c  >0 && (pFrom->aL
25bc0 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73  oop[nLoop-1]->ws
25bd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
25be0 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EROW)==0 ){.    
25bf0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
25c00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
25c10 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74  nt rc = wherePat
25c20 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
25c30 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  y(pWInfo, pWInfo
25c40 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f  ->pOrderBy, pFro
25c50 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
25c60 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
25c70 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c  RDERBY_LIMIT, nL
25c80 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
25c90 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d  oop[nLoop-1], &m
25ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25cb0 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72   rc==pWInfo->pOr
25cc0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
25ce0 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  fo->bOrderedInne
25cf0 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20  rLoop = 1;.     
25d00 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72         pWInfo->r
25d10 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20  evMask = m;.    
25d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25d30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
25d40 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
25d50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
25d60 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29  ERE_SORTBYGROUP)
25d70 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e  .        && pWIn
25d80 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e  fo->nOBSat==pWIn
25d90 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
25da0 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20  xpr && nLoop>0. 
25db0 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d     ){.      Bitm
25dc0 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
25dd0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65  .      int nOrde
25de0 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  r = wherePathSat
25df0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
25e00 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  Info, pWInfo->pO
25e10 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
25e20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f     pFrom, 0, nLo
25e30 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
25e40 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65  op[nLoop-1], &re
25e50 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20  vMask.      );. 
25e60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
25e70 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29  nfo->sorted==0 )
25e80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64  ;.      if( nOrd
25e90 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er==pWInfo->pOrd
25ea0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
25eb0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73         pWInfo->s
25ec0 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  orted = 1;.     
25ed0 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
25ee0 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  sk = revMask;.  
25ef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25f00 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ..  pWInfo->nRow
25f10 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
25f20 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
25f30 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
25f40 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
25f50 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
25f60 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
25f70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25f80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
25f90 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
25fa0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
25fb0 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
25fc0 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
25fd0 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
25fe0 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
25ff0 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
26000 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
26010 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
26020 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
26030 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
26040 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
26050 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
26060 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
26070 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
26080 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
26090 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
260a0 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
260b0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
260c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
260d0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
260e0 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
260f0 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
26100 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
26110 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
26120 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
26130 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
26140 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
26150 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
26160 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
26170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
26180 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
26190 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
261a0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
261b0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
261c0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
261d0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
261e0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
261f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
26200 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
26210 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
26220 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
26230 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
26240 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57  dex *pIdx;..  pW
26250 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
26260 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
26270 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
26280 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
26290 43 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e 20  CLAUSE ) return 
262a0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
262b0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
262c0 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
262d0 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
262e0 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
262f0 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
26300 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
26310 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
26320 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67  .  if( pItem->fg
26330 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72  .isIndexedBy ) r
26340 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
26350 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
26360 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
26370 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
26380 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
26390 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
263a0 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d  gs = 0;.  pLoop-
263b0 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54  >nSkip = 0;.  pT
263c0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
263d0 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
263e0 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
263f0 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  EQ|WO_IS, 0);.  
26400 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
26410 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
26420 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
26430 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  _IS );.    pLoop
26440 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
26450 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
26460 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
26470 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
26480 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
26490 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
264a0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
264b0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
264c0 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
264d0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
264e0 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
264f0 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
26500 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
26510 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
26520 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  10) */.  }else{.
26530 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
26540 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
26550 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
26560 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  t){.      int op
26570 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  Mask;.      asse
26580 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rt( pLoop->aLTer
26590 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61  mSpace==pLoop->a
265a0 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69  LTerm );.      i
265b0 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  f( !IsUniqueInde
265c0 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c  x(pIdx).       |
265d0 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
265e0 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
265f0 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   || pIdx->nKeyCo
26600 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  l>ArraySize(pLoo
26610 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
26620 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
26630 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  e;.      opMask 
26640 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  = pIdx->uniqNotN
26650 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f  ull ? (WO_EQ|WO_
26660 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20  IS) : WO_EQ;.   
26670 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
26680 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
26690 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
266a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
266b0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
266c0 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c  r, j, 0, opMask,
266d0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
266e0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
266f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65  reak;.        te
26700 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
26710 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
26720 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   );.        pLoo
26730 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
26740 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
26750 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
26760 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
26770 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
26780 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
26790 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
267a0 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
267b0 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
267c0 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69  ( pIdx->isCoveri
267d0 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f  ng || (pItem->co
267e0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
267f0 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
26800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
26810 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
26820 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
26830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
26840 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
26850 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
26860 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
26870 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
26880 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
26890 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
268a0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
268b0 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
268c0 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
268d0 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
268e0 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
268f0 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
26900 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26910 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
26920 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
26930 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
26940 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
26950 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
26960 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
26970 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  pLoop->maskSelf 
26980 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
26990 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
269a0 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
269b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
269c0 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
269d0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
269e0 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
269f0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
26a00 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
26a10 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70  Sat =  pWInfo->p
26a20 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
26a30 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
26a40 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26a50 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
26a60 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
26a70 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
26a80 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
26a90 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
26aa0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
26ab0 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
26ac0 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
26ad0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
26ae0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
26af0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
26b00 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
26b10 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
26b20 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
26b30 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
26b40 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
26b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
26b60 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
26b70 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
26b80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
26b90 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
26ba0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
26bb0 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
26bc0 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
26bd0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
26be0 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
26bf0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
26c00 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
26c10 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
26c20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
26c30 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
26c40 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
26c50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
26c60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
26c70 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
26c80 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
26c90 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
26ca0 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
26cb0 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
26cc0 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
26cd0 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
26ce0 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
26cf0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
26d00 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
26d10 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
26d20 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
26d30 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
26d40 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
26d50 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
26d60 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
26d70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
26d80 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
26d90 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
26da0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
26db0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
26dc0 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
26dd0 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
26de0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
26df0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
26e00 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
26e10 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
26e20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
26e30 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
26e40 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
26e50 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
26e60 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
26e70 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
26e80 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
26e90 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
26ea0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
26eb0 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
26ec0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
26ed0 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
26f00 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
26f10 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
26f40 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
26f50 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
26f60 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
26f70 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
26f80 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
26f90 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
26fa0 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
26fb0 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
26fc0 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
26fd0 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
26fe0 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
26ff0 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
27000 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
27010 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
27020 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
27030 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
27040 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
27050 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
27060 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
27070 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
27080 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
27090 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
270a0 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
270b0 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
270c0 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
270d0 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
270e0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
270f0 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
27100 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
27110 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
27120 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
27130 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
27140 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
27150 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
27160 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
27170 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
27180 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
27190 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
271a0 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
271b0 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
271c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
271d0 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
271e0 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
271f0 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
27200 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
27210 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
27220 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
27230 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
27240 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
27250 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
27260 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
27270 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
27280 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
27290 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
272a0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
272b0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
272c0 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
272d0 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
272e0 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
272f0 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
27300 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
27310 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
27320 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
27330 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
27340 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
27350 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
27360 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
27370 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
27380 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
27390 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
273a0 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
273b0 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
273c0 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
273d0 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
273e0 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
273f0 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
27400 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
27410 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
27420 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
27430 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
27440 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
27450 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
27460 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
27470 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27480 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
27490 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
274a0 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
274b0 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
274c0 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
274d0 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
274e0 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
274f0 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
27500 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
27510 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
27520 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
27530 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
27540 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
27550 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
27560 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
27570 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
27580 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
27590 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
275a0 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
275b0 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
275c0 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
275d0 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
275e0 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
275f0 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
27600 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
27610 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
27620 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
27630 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27640 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
27650 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
27660 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
27670 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
27680 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
27690 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
276a0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
276b0 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
276c0 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
276d0 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
276e0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
276f0 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
27700 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
27710 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
27720 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
27730 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
27740 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
27750 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
27760 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
27770 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
27780 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
27790 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
277a0 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
277b0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
277c0 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
277d0 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
277e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
277f0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
27800 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
27810 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
27820 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
27830 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
27840 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
27850 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
27860 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
27870 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
27880 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70  ** The iIdxCur p
27890 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
278a0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
278b0 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a   an index.  If .
278c0 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  ** WHERE_OR_SUBC
278d0 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49  LAUSE is set, iI
278e0 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72  dxCur is the cur
278f0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  sor number of an
27900 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65   index.** to use
27910 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
27920 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20  rocessing.  The 
27930 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f  WHERE clause sho
27940 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  uld use this.** 
27950 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e  specific cursor.
27960 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41    If WHERE_ONEPA
27970 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65  SS_DESIRED is se
27980 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20  t, then iIdxCur 
27990 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
279a0 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72  cursor in an arr
279b0 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f  ay of cursors fo
279c0 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20  r all indices.  
279d0 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a  iIdxCur should.*
279e0 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d  * be used to com
279f0 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  pute the appropr
27a00 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65  iate cursor depe
27a10 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69  nding on which i
27a20 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e  ndex is.** used.
27a30 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
27a40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
27a50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27a60 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
27a70 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
27a80 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
27a90 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f  pTabList,      /
27aa0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
27ab0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
27ac0 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
27ad0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
27ae0 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ere,           /
27af0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
27b00 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
27b10 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
27b20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28  /* An ORDER BY (
27b30 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
27b40 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
27b50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
27b60 74 69 6e 63 74 53 65 74 2c 20 2f 2a 20 54 72 79  tinctSet, /* Try
27b70 20 6e 6f 74 20 74 6f 20 6f 75 74 70 75 74 20 74   not to output t
27b80 77 6f 20 72 6f 77 73 20 74 68 61 74 20 64 75 70  wo rows that dup
27b90 6c 69 63 61 74 65 20 74 68 65 73 65 20 2a 2f 0a  licate these */.
27ba0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
27bb0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
27bc0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
27bd0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
27be0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
27bf0 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20  AuxArg          
27c00 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
27c10 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73  R_SUBCLAUSE is s
27c20 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
27c30 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53    ** If WHERE_US
27c60 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68  E_LIMIT, then th
27c70 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a  e limit amount *
27c80 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
27c90 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
27ca0 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20    /* Num. bytes 
27cb0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68  allocated for Wh
27cc0 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a  ereInfo struct *
27cd0 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  /.  int nTabList
27ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27cf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
27d00 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74  ents in pTabList
27d10 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
27d20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
27d30 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
27d40 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
27d50 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
27d60 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
27d70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
27d80 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
27d90 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
27da0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
27db0 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
27dc0 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74   /* Cursors that
27dd0 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73   are not yet pos
27de0 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65  itioned */.  Whe
27df0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57  reLoopBuilder sW
27e00 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57  LB;     /* The W
27e10 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72  hereLoop builder
27e20 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
27e30 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
27e40 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
27e50 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
27e60 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
27e70 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  vel;        /* A
27e80 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
27e90 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a   pWInfo->a[] */.
27ea0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
27eb0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
27ec0 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e  Pointer to a sin
27ed0 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  gle WhereLoop ob
27ee0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69  ject */.  int ii
27ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27f00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
27f10 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
27f20 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
27f30 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
27f40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
27f50 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
27f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27f70 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
27f80 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20  u8 bFordelete = 
27f90 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50  0;         /* OP
27fa0 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f  FLAG_FORDELETE o
27fb0 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f  r zero, as appro
27fc0 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73  priate */..  ass
27fd0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
27fe0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
27ff0 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c  _MULTIROW)==0 ||
28000 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72   (.        (wctr
28010 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
28020 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
28030 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74  =0 .     && (wct
28040 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28050 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
28060 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e   .  ));..  /* On
28070 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f  ly one of WHERE_
28080 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20  OR_SUBCLAUSE or 
28090 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
280a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
280b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
280c0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
280d0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
280e0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
280f0 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d  HERE_USE_LIMIT)=
28100 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  =0 );..  /* Vari
28110 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
28120 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
28130 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
28140 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
28150 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f  eof(sWLB));..  /
28160 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50  * An ORDER/GROUP
28170 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f   BY clause of mo
28180 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73  re than 63 terms
28190 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
281a0 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61  ized */.  testca
281b0 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  se( pOrderBy && 
281c0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
281d0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
281e0 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
281f0 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  erBy->nExpr>=BMS
28200 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
28210 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
28220 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
28230 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
28240 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
28250 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
28260 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
28270 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
28280 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
28290 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
282a0 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
282b0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
282c0 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
282d0 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
282e0 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
282f0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
28300 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
28310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
28320 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
28330 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
28340 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
28350 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
28360 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
28370 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
28380 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
28390 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
283a0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
283b0 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
283c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
283d0 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
283e0 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
283f0 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
28400 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
28410 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
28420 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
28430 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
28440 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
28450 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
28460 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
28470 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
28480 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  USE flag is set,
28490 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
284a0 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
284b0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
284c0 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
284d0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
284e0 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
284f0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
28500 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
28510 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
28520 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
28530 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
28540 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28550 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
28560 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
28570 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
28580 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
28590 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
285a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
285b0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
285c0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
285d0 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
285e0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
285f0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
28600 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
28610 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
28620 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
28630 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
28640 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
28650 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
28660 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
28670 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
28680 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
28690 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
286a0 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
286b0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
286c0 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
286d0 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
286e0 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
286f0 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
28700 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
28710 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
28720 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
28730 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
28740 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
28750 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
28760 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
28770 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
28780 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
28790 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
287a0 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
287b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
287c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
287d0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
287e0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
287f0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
28800 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
28810 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
28820 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
28830 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
28840 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
28850 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
28860 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
28870 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
28880 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28890 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
288a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
288b0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
288c0 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53  Info->pDistinctS
288d0 65 74 20 3d 20 70 44 69 73 74 69 6e 63 74 53 65  et = pDistinctSe
288e0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
288f0 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43  eak = pWInfo->iC
28900 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
28910 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
28920 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  );.  pWInfo->wct
28930 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
28940 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  lags;.  pWInfo->
28950 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67  iLimit = iAuxArg
28960 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
28970 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
28980 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
28990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
289a0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
289b0 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a  EPASS_OFF );  /*
289c0 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74   ONEPASS default
289d0 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d  s to OFF */.  pM
289e0 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
289f0 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57  ->sMaskSet;.  sW
28a00 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e  LB.pWInfo = pWIn
28a10 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d  fo;.  sWLB.pWC =
28a20 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
28a30 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68   sWLB.pNew = (Wh
28a40 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72  ereLoop*)(((char
28a50 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57  *)pWInfo)+nByteW
28a60 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
28a70 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
28a80 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29  NMENT(sWLB.pNew)
28a90 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49   );.  whereLoopI
28aa0 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a  nit(sWLB.pNew);.
28ab0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28ac0 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d  BUG.  sWLB.pNew-
28ad0 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64  >cId = '*';.#end
28ae0 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  if..  /* Split t
28af0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28b00 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
28b10 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
28b20 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
28b30 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
28b40 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
28b50 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
28b60 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
28b70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
28b80 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e  te3WhereClauseIn
28b90 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
28ba0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69   pWInfo);.  sqli
28bb0 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70  te3WhereSplit(&p
28bc0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65  WInfo->sWC, pWhe
28bd0 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
28be0 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
28bf0 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
28c00 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
28c10 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
28c20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
28c30 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
28c40 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
28c50 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
28c60 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f   thru..  */.  fo
28c70 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e  r(ii=0; ii<sWLB.
28c80 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  pWC->nTerm; ii++
28c90 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c  ){.    if( nTabL
28ca0 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ist==0 || sqlite
28cb0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
28cc0 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d  otJoin(sWLB.pWC-
28cd0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
28ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28cf0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
28d00 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69  , sWLB.pWC->a[ii
28d10 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d  ].pExpr, pWInfo-
28d20 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20  >iBreak,.       
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e    SQLITE_JUMPIFN
28d50 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42  ULL);.      sWLB
28d60 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c  .pWC->a[ii].wtFl
28d70 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
28d80 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
28d90 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
28da0 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
28db0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
28dc0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
28dd0 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
28de0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f  nfo->nOBSat = pO
28df0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
28e00 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
28e10 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
28e20 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
28e30 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
28e40 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
28e50 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
28e60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  }.  }..  /* Assi
28e70 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
28e80 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
28e90 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
28ea0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
28eb0 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74  .  ** The N-th t
28ec0 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
28ed0 63 6c 61 75 73 65 20 69 73 20 61 73 73 69 67 6e  clause is assign
28ee0 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  ed a bitmask of 
28ef0 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  1<<N..  **.  ** 
28f00 54 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20  The rule of the 
28f10 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
28f20 65 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69  e ensures thta i
28f30 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
28f40 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61  sk for.  ** a ta
28f50 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20  ble T, then X-1 
28f60 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
28f70 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62  or all other tab
28f80 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
28f90 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69  of T..  ** Knowi
28fa0 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ng the bitmask f
28fb0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
28fc0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
28fd0 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a  eft join is.  **
28fe0 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
28ff0 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
29000 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
29010 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
29020 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
29030 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
29040 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
29050 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
29060 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
29070 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
29080 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
29090 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
290a0 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
290b0 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
290c0 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
290d0 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  ** WHERE_OR_SUBC
290e0 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65  LAUSE flag is se
290f0 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  t..  */.  for(ii
29100 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
29110 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
29120 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61    createMask(pMa
29130 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
29140 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
29150 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
29160 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61  eTabFuncArgs(pPa
29170 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e  rse, &pTabList->
29180 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e  a[ii], &pWInfo->
29190 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  sWC);.  }.#ifdef
291a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
291b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
291c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
291d0 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  +){.    Bitmask 
291e0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
291f0 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  GetMask(pMaskSet
29200 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
29210 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
29220 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42  assert( m==MASKB
29230 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65  IT(ii) );.  }.#e
29240 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
29250 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
29260 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f  bexpressions. */
29270 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
29280 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
29290 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
292a0 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  C);.  if( db->ma
292b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
292c0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
292d0 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46  r;..  if( wctrlF
292e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
292f0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
29300 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
29310 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
29320 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
29330 6e 66 6f 2d 3e 73 57 43 2c 20 70 44 69 73 74 69  nfo->sWC, pDisti
29340 6e 63 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  nctSet) ){.     
29350 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
29360 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
29370 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
29380 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
29390 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
293a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
293b0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
293c0 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
293d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
293e0 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
293f0 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
29400 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
29410 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
29420 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
29430 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
29440 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
29450 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
29460 72 64 65 72 42 79 20 3d 20 70 44 69 73 74 69 6e  rderBy = pDistin
29470 63 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ctSet;.    }.  }
29480 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
29490 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
294a0 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65  bjects */.#if de
294b0 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
294c0 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
294d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
294e0 65 20 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20  e & 0xffff ){.  
294f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
29500 69 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  intf("*** Optimi
29510 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77  zer Start *** (w
29520 63 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22  ctrlFlags: 0x%x"
29530 2c 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  ,wctrlFlags);.  
29540 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
29550 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d   & WHERE_USE_LIM
29560 49 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IT ){.      sqli
29570 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
29580 2c 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41  , limit: %d", iA
29590 75 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20  uxArg);.    }.  
295a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
295b0 69 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d  intf(")\n");.  }
295c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
295d0 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30  ereTrace & 0x100
295e0 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61   ){ /* Display a
295f0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
29600 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
29610 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
29620 43 6c 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42  ClausePrint(sWLB
29630 2e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  .pWC);.  }.#endi
29640 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  f..  if( nTabLis
29650 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f  t!=1 || whereSho
29660 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20  rtCut(&sWLB)==0 
29670 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  ){.    rc = wher
29680 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c  eLoopAddAll(&sWL
29690 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  B);.    if( rc )
296a0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
296b0 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66  Error;.  .#ifdef
296c0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
296d0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
296e0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
296f0 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61      /* Display a
29700 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ll of the WhereL
29710 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  oop objects */. 
29720 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a       WhereLoop *
29730 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  p;.      int i;.
29740 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
29750 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  st char zLabel[]
29760 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
29770 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
29780 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297b0 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48         "ABCDEFGH
297c0 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59  IJKLMNOPQRSTUVWY
297d0 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  XZ";.      for(p
297e0 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  =pWInfo->pLoops,
297f0 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e   i=0; p; p=p->pN
29800 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20  extLoop, i++){. 
29810 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20         p->cId = 
29820 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28  zLabel[i%sizeof(
29830 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20  zLabel)];.      
29840 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
29850 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
29860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
29870 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
29880 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
29890 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
298a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
298b0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
298c0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
298d0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
298e0 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
298f0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
29900 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
29910 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
29920 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29930 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
29940 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
29950 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
29960 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
29970 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
29980 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
29990 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
299a0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
299b0 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20   ALLBITS;.  }.  
299c0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
299d0 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
299e0 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
299f0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
29a00 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
29a10 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
29a20 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
29a30 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
29a40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
29a50 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
29a60 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
29a70 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
29a80 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
29a90 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  fo->nOBSat>0 ){.
29aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
29ab0 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
29ac0 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70  BY=%d,0x%llx", p
29ad0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70  WInfo->nOBSat, p
29ae0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
29af0 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
29b00 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
29b10 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
29b20 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
29b30 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
29b40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
29b50 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
29b60 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
29b70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29b80 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
29b90 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
29ba0 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
29bb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
29bc0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
29bd0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
29be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
29bf0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
29c00 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
29c10 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
29c20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
29c30 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
29c40 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
29c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
29c70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
29c80 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
29c90 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
29ca0 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
29cb0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
29cc0 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
29cd0 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e  i].pWLoop, sWLB.
29ce0 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pWC);.    }.  }.
29cf0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65  #endif.  /* Atte
29d00 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c  mpt to omit tabl
29d10 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e  es from the join
29d20 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66   that do not eff
29d30 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a  ect the result *
29d40 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  /.  if( pWInfo->
29d50 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20  nLevel>=2.   && 
29d60 70 44 69 73 74 69 6e 63 74 53 65 74 21 3d 30 0a  pDistinctSet!=0.
29d70 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
29d80 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
29d90 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
29da0 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  n).  ){.    Bitm
29db0 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71  ask tabUsed = sq
29dc0 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
29dd0 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  stUsage(pMaskSet
29de0 2c 20 70 44 69 73 74 69 6e 63 74 53 65 74 29 3b  , pDistinctSet);
29df0 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f  .    if( sWLB.pO
29e00 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
29e10 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74  tabUsed |= sqlit
29e20 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55  e3WhereExprListU
29e30 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73  sage(pMaskSet, s
29e40 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  WLB.pOrderBy);. 
29e50 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
29e60 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
29e70 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  2 ){.      Where
29e80 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45  Term *pTerm, *pE
29e90 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20  nd;.      pLoop 
29ea0 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e  = pWInfo->a[pWIn
29eb0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57  fo->nLevel-1].pW
29ec0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  Loop;.      if( 
29ed0 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  (pWInfo->pTabLis
29ee0 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62  t->a[pLoop->iTab
29ef0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ].fg.jointype & 
29f00 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72  JT_LEFT)==0 ) br
29f10 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28  eak;.      if( (
29f20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
29f30 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
29f40 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
29f50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
29f60 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
29f70 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
29f80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
29f90 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62  }.      if( (tab
29fa0 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  Used & pLoop->ma
29fb0 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65  skSelf)!=0 ) bre
29fc0 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  ak;.      pEnd =
29fd0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73   sWLB.pWC->a + s
29fe0 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  WLB.pWC->nTerm;.
29ff0 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
2a000 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65  sWLB.pWC->a; pTe
2a010 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  rm<pEnd; pTerm++
2a020 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
2a030 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2a040 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   & pLoop->maskSe
2a050 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  lf)!=0.         
2a060 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
2a070 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
2a080 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
2a090 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2a0a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a0b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a0c0 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e     if( pTerm<pEn
2a0d0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
2a0e0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
2a0f0 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f  ff, ("-> drop lo
2a100 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e  op %c not used\n
2a110 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b  ", pLoop->cId));
2a120 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  .      pWInfo->n
2a130 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e  Level--;.      n
2a140 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d  TabList--;.    }
2a150 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
2a160 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f  E(0xffff,("*** O
2a170 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
2a180 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57  d ***\n"));.  pW
2a190 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51  Info->pParse->nQ
2a1a0 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e  ueryLoop += pWIn
2a1b0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
2a1c0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
2a1d0 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
2a1e0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2a1f0 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
2a200 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
2a210 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
2a220 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
2a230 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
2a240 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  opriate..  */.  
2a250 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
2a260 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2a270 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2a280 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
2a290 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
2a2a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a2b0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2a2c0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  D)!=0 ){.    int
2a2d0 20 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66   wsFlags = pWInf
2a2e0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
2a2f0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  wsFlags;.    int
2a300 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c   bOnerow = (wsFl
2a310 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
2a320 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  OW)!=0;.    if( 
2a330 62 4f 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20  bOnerow.     || 
2a340 28 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ((wctrlFlags & W
2a350 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
2a360 54 49 52 4f 57 29 21 3d 30 0a 20 20 20 20 20 20  TIROW)!=0.      
2a370 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c       && 0==(wsFl
2a380 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2a390 55 41 4c 54 41 42 4c 45 29 29 0a 20 20 20 20 29  UALTABLE)).    )
2a3a0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
2a3b0 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72  eOnePass = bOner
2a3c0 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e  ow ? ONEPASS_SIN
2a3d0 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55  GLE : ONEPASS_MU
2a3e0 4c 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48  LTI;.      if( H
2a3f0 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74  asRowid(pTabList
2a400 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20  ->a[0].pTab) && 
2a410 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
2a420 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
2a430 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46        if( wctrlF
2a440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2a450 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b  PASS_MULTIROW ){
2a460 0a 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64  .          bFord
2a470 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46  elete = OPFLAG_F
2a480 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  ORDELETE;.      
2a490 20 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e    }.        pWIn
2a4a0 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
2a4b0 3e 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c  >wsFlags = (wsFl
2a4c0 61 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58  ags & ~WHERE_IDX
2a4d0 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a  _ONLY);.      }.
2a4e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a4f0 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
2a500 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
2a510 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
2a520 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
2a530 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
2a540 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2a550 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65   for(ii=0, pLeve
2a560 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c  l=pWInfo->a; ii<
2a570 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20  nTabList; ii++, 
2a580 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
2a590 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
2a5a0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
2a5b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
2a5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2a5d0 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
2a5e0 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
2a5f0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75  ndex */.    stru
2a600 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2a610 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
2a620 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
2a630 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2a640 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
2a650 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2a660 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
2a670 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2a680 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
2a690 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  ema);.    pLoop 
2a6a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2a6b0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
2a6c0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2a6d0 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
2a6e0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
2a6f0 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
2a700 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
2a710 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
2a720 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2a730 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  LE.    if( (pLoo
2a740 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2a750 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2a760 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2a770 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
2a780 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2a790 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
2a7a0 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
2a7b0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
2a7c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2a7d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a7e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
2a7f0 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
2a800 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
2a810 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
2a820 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2a830 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20  {.      /* noop 
2a840 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  */.    }else.#en
2a850 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  dif.    if( (pLo
2a860 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2a870 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2a880 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
2a890 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a8a0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
2a8b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
2a8c0 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
2a8d0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
2a8e0 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
2a8f0 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
2a900 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e      op = OP_Open
2a910 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70  Write;.        p
2a920 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
2a930 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65  ass[0] = pTabIte
2a940 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
2a950 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    };.      sqlit
2a960 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
2a970 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
2a980 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
2a990 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73  , op);.      ass
2a9a0 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69  ert( pTabItem->i
2a9b0 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e  Cursor==pLevel->
2a9c0 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20  iTabCur );.     
2a9d0 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
2a9e0 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2a9f0 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
2aa00 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
2aa10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2aa20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2aa30 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
2aa40 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
2aa50 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  S );.      if( p
2aa60 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2aa70 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
2aa80 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26  pTab->nCol<BMS &
2aa90 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
2aaa0 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
2aab0 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
2aac0 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
2aad0 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
2aae0 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
2aaf0 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
2ab00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ab10 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
2ab20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2ab30 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
2ab40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ab50 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
2ab60 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
2ab70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ab80 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
2ab90 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e     if( pLoop->u.
2aba0 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
2abb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2abc0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2abd0 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c  , OPFLAG_SEEKEQ|
2abe0 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
2abf0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2ac00 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2ac10 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2ac20 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74  eP5(v, bFordelet
2ac30 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  e);.      }.#ifd
2ac40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ac50 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2ac60 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  K.      sqlite3V
2ac70 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
2ac80 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
2ac90 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2aca0 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  or, 0, 0,.      
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a        (const u8*
2acd0 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  )&pTabItem->colU
2ace0 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  sed, P4_INT64);.
2acf0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2ad00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
2ad10 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
2ad20 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
2ad30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
2ad40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2ad50 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2ad60 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
2ad70 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
2ad80 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
2ad90 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
2ada0 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72     int iIndexCur
2adb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  ;.      int op =
2adc0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
2add0 20 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69      /* iAuxArg i
2ade0 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20  s always set if 
2adf0 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  to a positive va
2ae00 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69  lue if ONEPASS i
2ae10 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  s possible */.  
2ae20 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78      assert( iAux
2ae30 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66  Arg!=0 || (pWInf
2ae40 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2ae50 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2ae60 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  SIRED)==0 );.   
2ae70 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2ae80 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  (pTab) && IsPrim
2ae90 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29  aryKeyIndex(pIx)
2aea0 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72  .       && (wctr
2aeb0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2aec0 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a  R_SUBCLAUSE)!=0.
2aed0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2aee0 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20   /* This is one 
2aef0 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70  term of an OR-op
2af00 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67  timization using
2af10 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2af20 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a   of a.        **
2af30 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
2af40 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66  able.  No need f
2af50 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e  or a separate in
2af60 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  dex */.        i
2af70 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65  IndexCur = pLeve
2af80 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20  l->iTabCur;.    
2af90 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20      op = 0;.    
2afa0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e    }else if( pWIn
2afb0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
2afc0 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
2afd0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d       Index *pJ =
2afe0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
2aff0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  >pIndex;.       
2b000 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
2b010 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73  xArg;.        as
2b020 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73  sert( wctrlFlags
2b030 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2b040 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20  _DESIRED );.    
2b050 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
2b060 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78  S(pJ) && pJ!=pIx
2b070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49   ){.          iI
2b080 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20  ndexCur++;.     
2b090 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e       pJ = pJ->pN
2b0a0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
2b0b0 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2b0c0 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2b0d0 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2b0e0 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64  nePass[1] = iInd
2b0f0 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c  exCur;.      }el
2b100 73 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26  se if( iAuxArg &
2b110 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2b120 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2b130 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)!=0 ){.      
2b140 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41    iIndexCur = iA
2b150 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f  uxArg;.        o
2b160 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78  p = OP_ReopenIdx
2b170 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b180 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2b190 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2b1a0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
2b1b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2b1c0 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
2b1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2b1e0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2b1f0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2b200 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43   assert( iIndexC
2b210 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ur>=0 );.      i
2b220 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  f( op ){.       
2b230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b240 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78  p3(v, op, iIndex
2b250 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
2b260 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
2b270 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
2b280 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
2b290 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2b2a0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2b2b0 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
2b2c0 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  NT)!=0.         
2b2d0 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
2b2e0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
2b2f0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53  MN_RANGE|WHERE_S
2b300 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20  KIPSCAN))==0.   
2b310 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
2b320 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
2b330 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d  RE_ORDERBY_MIN)=
2b340 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2b350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b360 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
2b370 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f  PFLAG_SEEKEQ); /
2b380 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32  * Hint to COMDB2
2b390 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
2b3a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2b3b0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
2b3c0 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66  >zName));.#ifdef
2b3d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2b3e0 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
2b3f0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2b400 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20      u64 colUsed 
2b410 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2b420 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20  nt ii, jj;.     
2b430 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
2b440 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  i<pIx->nColumn; 
2b450 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
2b460 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43     jj = pIx->aiC
2b470 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20  olumn[ii];.     
2b480 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20         if( jj<0 
2b490 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b4a0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36          if( jj>6
2b4b0 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20  3 ) jj = 63;.   
2b4c0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
2b4d0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  abItem->colUsed 
2b4e0 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d  & MASKBIT(jj))==
2b4f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2b500 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65            colUse
2b510 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28  d |= ((u64)1)<<(
2b520 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29  ii<63 ? ii : 63)
2b530 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b550 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
2b560 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
2b570 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30   iIndexCur, 0, 0
2b580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5a0 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c    (u8*)&colUsed,
2b5b0 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
2b5c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
2b5d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2b5e0 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a  LUMN_USED_MASK *
2b5f0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2b600 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29      if( iDb>=0 )
2b610 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2b620 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2b630 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49   iDb);.  }.  pWI
2b640 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
2b650 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2b660 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d  dr(v);.  if( db-
2b670 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2b680 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2b690 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  rror;..  /* Gene
2b6a0 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
2b6b0 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
2b6c0 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
2b6d0 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
2b6e0 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
2b6f0 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
2b700 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
2b710 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
2b720 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
2b730 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
2b740 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
2b750 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73  ii=0; ii<nTabLis
2b760 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  t; ii++){.    in
2b770 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20  t addrExplain;. 
2b780 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a     int wsFlags;.
2b790 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2b7a0 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  Info->a[ii];.   
2b7b0 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65   wsFlags = pLeve
2b7c0 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
2b7d0 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  gs;.#ifndef SQLI
2b7e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
2b7f0 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20  C_INDEX.    if( 
2b800 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
2b810 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2b820 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
2b830 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
2b840 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
2b850 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f  (pParse, &pWInfo
2b860 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20  ->sWC,.         
2b870 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74         &pTabList
2b880 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2b890 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  m], notReady, pL
2b8a0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  evel);.      if(
2b8b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b8c0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2b8d0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
2b8e0 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45  #endif.    addrE
2b8f0 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33  xplain = sqlite3
2b900 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53  WhereExplainOneS
2b910 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61  can(.        pPa
2b920 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2b930 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65  Level, ii, pLeve
2b940 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46  l->iFrom, wctrlF
2b950 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20  lags.    );.    
2b960 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2b970 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2b980 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2b990 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c    notReady = sql
2b9a0 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65  ite3WhereCodeOne
2b9b0 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f  LoopStart(pWInfo
2b9c0 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b  , ii, notReady);
2b9d0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  .    pWInfo->iCo
2b9e0 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d  ntinue = pLevel-
2b9f0 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69  >addrCont;.    i
2ba00 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52  f( (wsFlags&WHER
2ba10 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26  E_MULTI_OR)==0 &
2ba20 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  & (wctrlFlags&WH
2ba30 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2ba40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
2ba50 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61  lite3WhereAddSca
2ba60 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c  nStatus(v, pTabL
2ba70 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64  ist, pLevel, add
2ba80 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d  rExplain);.    }
2ba90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e  .  }..  /* Done.
2baa0 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
2bab0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
2bac0 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  in WHERE-core"))
2bad0 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
2bae0 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
2baf0 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
2bb00 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
2bb10 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
2bb20 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
2bb30 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
2bb40 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2bb50 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
2bb60 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
2bb70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
2bb80 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2bb90 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
2bba0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
2bbb0 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
2bbc0 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
2bbd0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
2bbe0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2bbf0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
2bc00 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
2bc10 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
2bc20 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
2bc30 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2bc40 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
2bc50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2bc60 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
2bc70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2bc80 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2bc90 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  Loop;.  SrcList 
2bca0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
2bcb0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
2bcc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2bcd0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
2bce0 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
2bcf0 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
2bd00 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c    */.  VdbeModul
2bd10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
2bd20 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  d WHERE-core"));
2bd30 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2bd40 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2bd50 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
2bd60 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
2bd70 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2bd80 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  addr;.    pLevel
2bd90 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2bda0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
2bdb0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
2bdc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2bdd0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
2bde0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
2bdf0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2be00 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
2be10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2be20 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c  AddOp3(v, pLevel
2be30 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
2be40 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c  , pLevel->p2, pL
2be50 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20  evel->p3);.     
2be60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2be70 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
2be80 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p5);.      VdbeC
2be90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2bea0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2beb0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
2bec0 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  OP_Next);.      
2bed0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2bee0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  , pLevel->op==OP
2bef0 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64  _Prev);.      Vd
2bf00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
2bf10 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56  pLevel->op==OP_V
2bf20 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Next);.    }.   
2bf30 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2bf40 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
2bf50 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
2bf60 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
2bf70 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
2bf80 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
2bf90 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
2bfa0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2bfb0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2bfc0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
2bfd0 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
2bfe0 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
2bff0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
2c000 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
2c010 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
2c020 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2c030 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
2c040 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
2c050 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f   if( pIn->eEndLo
2c060 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  opOp!=OP_Noop ){
2c070 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c090 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c  pIn->eEndLoopOp,
2c0a0 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
2c0b0 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
2c0c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2c0d0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2c0e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2c0f0 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2c100 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70  pOp==OP_PrevIfOp
2c110 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  en);.          V
2c120 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2c130 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2c140 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29  ==OP_NextIfOpen)
2c150 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2c170 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
2c180 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
2c190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c1a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2c1b0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2c1c0 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
2c1d0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
2c1e0 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73  rSkip ){.      s
2c1f0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2c200 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
2c210 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ip);.      VdbeC
2c220 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
2c230 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
2c240 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  ", pLoop->u.btre
2c250 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
2c260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c270 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2c280 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2c290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c2a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2c2b0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2c2c0 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  -2);.    }.#ifnd
2c2d0 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44  ef SQLITE_LIKE_D
2c2e0 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42  OESNT_MATCH_BLOB
2c2f0 53 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  S.    if( pLevel
2c300 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b  ->addrLikeRep ){
2c310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
2c330 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e  ecrJumpZero, (in
2c340 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  t)(pLevel->iLike
2c350 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20  RepCntr>>1),.   
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
2c380 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20  rLikeRep);.     
2c390 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2c3a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2c3b0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
2c3c0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
2c3d0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2c3e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2c3f0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
2c400 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
2c410 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2c420 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
2c430 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2c440 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2c450 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2c460 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c470 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2c480 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
2c490 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2c4a0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2c4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2c4c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2c4d0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
2c4e0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
2c4f0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
2c500 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2c510 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2c520 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
2c530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c540 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
2c550 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
2c560 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
2c570 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
2c580 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
2c590 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2c5a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c5b0 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
2c5c0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
2c5d0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
2c5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2c5f0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2c600 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2c610 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
2c620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2c630 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
2c640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
2c650 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2c660 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
2c670 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c690 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2c6a0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2c6b0 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
2c6c0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
2c6d0 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
2c6e0 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
2c6f0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2c700 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
2c710 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
2c720 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2c730 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
2c740 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
2c750 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2c760 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
2c770 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
2c780 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
2c790 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
2c7a0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
2c7b0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
2c7c0 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
2c7d0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
2c7e0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
2c7f0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2c800 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2c810 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2c820 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2c830 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2c840 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
2c850 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
2c860 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
2c870 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2c880 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
2c890 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
2c8a0 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
2c8b0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
2c8c0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
2c8d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
2c8e0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43  outine into OP_C
2c8f0 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  opy of result co
2c900 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67  ntained in a reg
2c910 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50  ister..    ** OP
2c920 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f  _Rowid becomes O
2c930 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  P_Null..    */. 
2c940 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
2c950 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2c960 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
2c970 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74  ailed ){.      t
2c980 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
2c990 43 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Copy(v, pLevel->
2c9a0 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c  addrBody, pLevel
2c9b0 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  ->iTabCur,.     
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d         pTabItem-
2c9e0 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a  >regResult, 0);.
2c9f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2ca00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c      }..    /* Cl
2ca10 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
2ca20 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
2ca30 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
2ca40 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
2ca50 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
2ca60 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72  not close cursor
2ca70 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
2ca80 65 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20  eused by the OR 
2ca90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
2caa0 20 2a 2a 20 28 57 48 45 52 45 5f 4f 52 5f 53 55   ** (WHERE_OR_SU
2cab0 42 43 4c 41 55 53 45 29 2e 20 20 41 6e 64 20 64  BCLAUSE).  And d
2cac0 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20  o not close the 
2cad0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72  OP_OpenWrite cur
2cae0 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61  sors.    ** crea
2caf0 74 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50  ted for the ONEP
2cb00 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ASS optimization
2cb10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2cb20 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
2cb30 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
2cb40 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
2cb50 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
2cb60 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2cb70 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2cb80 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
2cb90 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
2cba0 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
2cbb0 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
2cbc0 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2cbd0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2cbe0 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
2cbf0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
2cc00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2cc10 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
2cc20 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
2cc30 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2cc40 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
2cc50 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2cc60 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77  !=0.       && (w
2cc70 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
2cc80 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
2cc90 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
2cca0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21  pLevel->iIdxCur!
2ccb0 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e  =pWInfo->aiCurOn
2ccc0 65 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29  ePass[1].      )
2ccd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2cce0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2ccf0 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
2cd00 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
2cd10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2cd20 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
2cd30 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
2cd40 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73  e VDBE code subs
2cd50 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
2cd60 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
2cd70 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73  om the index ins
2cd80 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65  tead of from the
2cd90 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73   table where pos
2cda0 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20  sible.  In some 
2cdb0 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69  cases.    ** thi
2cdc0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70  s optimization p
2cdd0 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c  revents the tabl
2cde0 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e  e from ever bein
2cdf0 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61  g read, which ca
2ce00 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61  n.    ** yield a
2ce10 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72   significant per
2ce20 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
2ce30 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
2ce40 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
2ce50 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
2ce60 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
2ce70 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
2ce80 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
2ce90 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
2cea0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
2ceb0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
2cec0 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
2ced0 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
2cee0 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
2cef0 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
2cf00 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
2cf10 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
2cf20 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
2cf30 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
2cf40 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
2cf50 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
2cf60 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
2cf70 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2cf80 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
2cf90 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58  NDEXED|WHERE_IDX
2cfa0 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
2cfb0 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
2cfc0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
2cfd0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
2cfe0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2cff0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
2d000 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
2d010 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
2d020 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
2d030 78 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  x.     && (pWInf
2d040 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2d050 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73  PASS_OFF || !Has
2d060 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62  Rowid(pIdx->pTab
2d070 6c 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62  le)).     && !db
2d080 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
2d090 20 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74     ){.      last
2d0a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2d0b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2d0c0 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e      k = pLevel->
2d0d0 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20  addrBody;.      
2d0e0 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
2d0f0 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20  eGetOp(v, k);.  
2d100 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74      for(; k<last
2d110 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
2d120 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
2d130 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
2d140 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
2d150 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
2d160 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
2d170 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2d180 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b  int x = pOp->p2;
2d190 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d1a0 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d  t( pIdx->pTable=
2d1b0 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  =pTab );.       
2d1c0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2d1d0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
2d1e0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
2d1f0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
2d200 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
2d210 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
2d220 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78   pPk->aiColumn[x
2d230 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ];.            a
2d240 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
2d250 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d260 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
2d270 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
2d280 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  dx, x);.        
2d290 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
2d2a0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
2d2b0 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20  2 = x;.         
2d2c0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
2d2d0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2d2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d2f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
2d300 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2d310 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2d320 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20   || x>=0 );.    
2d330 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2d340 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
2d350 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
2d360 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
2d370 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
2d380 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
2d390 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b  e = OP_IdxRowid;
2d3a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d3b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2d3c0 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
2d3d0 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
2d3e0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
2d3f0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
2d400 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
2d410 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
2d420 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.