/ Hex Artifact Content
Login

Artifact 6bbf9284f4f15a6fa48663d033870cc0d7f5ee66:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1ad0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1ae0: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1af0: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b00: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b10: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b20: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b30: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b40: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b50: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b60: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b70: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1b80: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1b90: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1ba0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bb0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1bc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bd0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1be0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1bf0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c00: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c30: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c40: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c60: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c70: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1c80: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1c90: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1ca0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cf0: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d00: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d10: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d20: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d30: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d50: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d60: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d70: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1d80: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1d90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1da0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1db0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1dc0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1dd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1de0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1df0: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e00: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e10: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e20: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e30: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e50: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e70: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1e90: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ea0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1eb0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ec0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ed0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1ee0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1ef0: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f00: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f20: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f50: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f70: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1f80: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1f90: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1fd0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
1fe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ff0: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2000: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2010: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2030: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2040: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2050: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2060: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2070: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2080: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2090: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20a0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20c0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
20e0: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
20f0: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2100: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2110: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2120: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2130: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2150: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2160: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2170: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2180: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2190: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21a0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21b0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
21e0: 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20  an->pWC = pWC;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e             pScan
2200: 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20  ->k = k+1;.     
2210: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54         return pT
2220: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  erm;.          }
2230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2240: 20 7d 0a 20 20 20 20 20 20 70 57 43 20 3d 20 70   }.      pWC = p
2250: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2260: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68    k = 0;.    }wh
2270: 69 6c 65 28 20 70 57 43 21 3d 30 20 29 3b 0a 20  ile( pWC!=0 );. 
2280: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 69 45     if( pScan->iE
2290: 71 75 69 76 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv>=pScan->nEq
22a0: 75 69 76 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  uiv ) break;.   
22b0: 20 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f   pWC = pScan->pO
22c0: 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30  rigWC;.    k = 0
22d0: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 45 71  ;.    pScan->iEq
22e0: 75 69 76 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  uiv++;.  }.  ret
22f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2300: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45  Initialize a WHE
2310: 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65  RE clause scanne
2320: 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  r object.  Retur
2330: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2340: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
2350: 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  h.  Return NULL 
2360: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
2370: 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  matches..**.** T
2380: 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20  he scanner will 
2390: 62 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65  be searching the
23a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57   WHERE clause pW
23b0: 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b  C.  It will look
23c0: 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  .** for terms of
23d0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
23e0: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
23f0: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
2400: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20  umn of table.** 
2410: 69 43 75 72 2e 20 20 20 4f 72 20 69 66 20 70 49  iCur.   Or if pI
2420: 64 78 21 3d 30 20 74 68 65 6e 20 58 20 69 73 20  dx!=0 then X is 
2430: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f  column iColumn o
2440: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 20 20 70  f index pIdx.  p
2450: 49 64 78 0a 2a 2a 20 6d 75 73 74 20 62 65 20 6f  Idx.** must be o
2460: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2470: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2480: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6f 70 3e 20  .**.** The <op> 
2490: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
24a0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73  he operators des
24b0: 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b  cribed by opMask
24c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
24d0: 65 61 72 63 68 20 69 73 20 66 6f 72 20 58 20 61  earch is for X a
24e0: 6e 64 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  nd the WHERE cla
24f0: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72  use contains ter
2500: 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72  ms of the.** for
2510: 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20  m X=Y then this 
2520: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c  routine might al
2530: 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20  so return terms 
2540: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
2550: 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20  Y <op> <expr>". 
2560: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   The number of l
2570: 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74  evels of transit
2580: 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64  ivity is limited
2590: 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75  ,.** but is enou
25a0: 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73  gh to handle mos
25b0: 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72  t commonly occur
25c0: 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65  ring SQL stateme
25d0: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  nts..**.** If X 
25e0: 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47  is not the INTEG
25f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
2600: 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f  hen X must be co
2610: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a  mpatible with.**
2620: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
2630: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
2640: 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28   *whereScanInit(
2650: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53  .  WhereScan *pS
2660: 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  can,       /* Th
2670: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
2680: 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c  ct being initial
2690: 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  ized */.  WhereC
26a0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
26b0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
26c0: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e  lause to be scan
26d0: 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ned */.  int iCu
26e0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
26f0: 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
2700: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  an for */.  int 
2710: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
2720: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
2730: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75   scan for */.  u
2740: 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20  32 opMask,      
2750: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74         /* Operat
2760: 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f  or(s) to scan fo
2770: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
2780: 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx             /
2790: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
27a0: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
27b0: 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 70 53 63  ndex */.){.  pSc
27c0: 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70 57  an->pOrigWC = pW
27d0: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  C;.  pScan->pWC 
27e0: 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e  = pWC;.  pScan->
27f0: 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20 20  pIdxExpr = 0;.  
2800: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
2810: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  0;.  pScan->zCol
2820: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 66 28  lName = 0;.  if(
2830: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74   pIdx ){.    int
2840: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2850: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2860: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2870: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2880: 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20  XN_EXPR ){.     
2890: 20 70 53 63 61 6e 2d 3e 70 49 64 78 45 78 70 72   pScan->pIdxExpr
28a0: 20 3d 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70   = pIdx->aColExp
28b0: 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  r->a[j].pExpr;. 
28c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f     }else if( iCo
28d0: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62  lumn==pIdx->pTab
28e0: 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  le->iPKey ){.   
28f0: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f     iColumn = XN_
2900: 52 4f 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65  ROWID;.    }else
2910: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
2920: 29 7b 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e  ){.      pScan->
2930: 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70  idxaff = pIdx->p
2940: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
2950: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
2960: 20 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c       pScan->zCol
2970: 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a  lName = pIdx->az
2980: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20  Coll[j];.    }. 
2990: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
29a0: 6d 6e 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  mn==XN_EXPR ){. 
29b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
29c0: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
29d0: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
29e0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
29f0: 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d 20 69  an->aiCur[0] = i
2a00: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 69  Cur;.  pScan->ai
2a10: 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43 6f 6c  Column[0] = iCol
2a20: 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45  umn;.  pScan->nE
2a30: 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53 63 61  quiv = 1;.  pSca
2a40: 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b 0a 20  n->iEquiv = 1;. 
2a50: 20 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61   return whereSca
2a60: 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a  nNext(pScan);.}.
2a70: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2a80: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
2a90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2aa0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
2ab0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2ac0: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
2ad0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2ae0: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
2af0: 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20 69 6e  le iCur or of in
2b00: 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66 20 70  dex pIdx.** if p
2b10: 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70 3e 20  Idx!=0 and <op> 
2b20: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 4f  is one of the WO
2b30: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64  _xx operator cod
2b40: 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  es specified by.
2b50: 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  ** the op parame
2b60: 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ter.  Return a p
2b70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
2b80: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
2b90: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2ba0: 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74 68 65  * If pIdx!=0 the
2bb0: 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  n it must be one
2bc0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65 73 20   of the indexes 
2bd0: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e 20 20  of table iCur.  
2be0: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  .** Search for t
2bf0: 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 74 68  erms matching th
2c00: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
2c10: 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a 20 72  umn of pIdx.** r
2c20: 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69  ather than the i
2c30: 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
2c40: 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e 0a   of table iCur..
2c50: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72  **.** The term r
2c60: 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79  eturned might by
2c70: 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65   Y=<expr> if the
2c80: 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f  re is another co
2c90: 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74  nstraint in.** t
2ca0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2cb0: 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74  that specifies t
2cc0: 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75  hat X=Y.  Any su
2cd0: 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  ch constraints w
2ce0: 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69  ill be.** identi
2cf0: 66 69 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45  fied by the WO_E
2d00: 51 55 49 56 20 62 69 74 20 69 6e 20 74 68 65 20  QUIV bit in the 
2d10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2d20: 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20   field.  The.** 
2d30: 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75 6d 6e  aiCur[]/iaColumn
2d40: 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64 20 58  [] arrays hold X
2d50: 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75   and all its equ
2d60: 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72 65 20  ivalents. There 
2d70: 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74 73 20  are 11.** slots 
2d80: 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43 6f 6c  in aiCur[]/aiCol
2d90: 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20 6d 65  umn[] so that me
2da0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
2db0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
2dc0: 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65 71 75   10.** other equ
2dd0: 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 20  ivalent values. 
2de0: 20 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20   Hence a search 
2df0: 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72  for X will retur
2e00: 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31  n <expr> if X=A1
2e10: 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20 61 6e  .** and A1=A2 an
2e20: 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e 2e 20  d A2=A3 and ... 
2e30: 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41  and A9=A10 and A
2e40: 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a  10=<expr>..**.**
2e50: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75   If there are mu
2e60: 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
2e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
2e90: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20  <op> <expr>".** 
2ea0: 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65  then try for the
2eb0: 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70   one with no dep
2ec0: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78  endencies on <ex
2ed0: 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77  pr> - in other w
2ee0: 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65  ords where.** <e
2ef0: 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61  xpr> is a consta
2f00: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  nt expression of
2f10: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c   some kind.  Onl
2f20: 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73  y return entries
2f30: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20   of.** the form 
2f40: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
2f50: 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69   Y is a column i
2f60: 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  n another table 
2f70: 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a  if no terms of.*
2f80: 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  * the form "X <o
2f90: 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22  p> <const-expr>"
2fa0: 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20   exist.   If no 
2fb0: 74 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e  terms with a con
2fc0: 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69  stant RHS.** exi
2fd0: 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72  st, try to retur
2fe0: 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f  n a term that do
2ff0: 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51  es not use WO_EQ
3000: 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72  UIV..*/.WhereTer
3010: 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 46  m *sqlite3WhereF
3020: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
3030: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
3040: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
3050: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
3060: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
3070: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
3080: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
3090: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
30a0: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
30b0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
30c0: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
30d0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
30e0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
30f0: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
3100: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
3110: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
3120: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
3130: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
3140: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
3150: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
3160: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
3170: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
3180: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
3190: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
31a0: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
31b0: 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  rm *pResult = 0;
31c0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b  .  WhereTerm *p;
31d0: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
31e0: 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53  n;..  p = whereS
31f0: 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
3200: 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d  WC, iCur, iColum
3210: 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20  n, op, pIdx);.  
3220: 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  op &= WO_EQ|WO_I
3230: 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  S;.  while( p ){
3240: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
3250: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
3260: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
3270: 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69   if( p->prereqRi
3280: 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f  ght==0 && (p->eO
3290: 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30 20 29  perator&op)!=0 )
32a0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
32b0: 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74 6f 72  se( p->eOperator
32c0: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
32d0: 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
32e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32f0: 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65  pResult==0 ) pRe
3300: 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  sult = p;.    }.
3310: 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63 61      p = whereSca
3320: 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20  nNext(&scan);.  
3330: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73 75  }.  return pResu
3340: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lt;.}../*.** Thi
3350: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
3360: 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e  hes pList for an
3370: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
3380: 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  hes the iCol-th 
3390: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64  column.** of ind
33a0: 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex pIdx..**.** I
33b0: 66 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73  f such an expres
33c0: 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69  sion is found, i
33d0: 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  ts index in pLis
33e0: 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e  t->a[] is return
33f0: 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70  ed. If.** no exp
3400: 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64  ression is found
3410: 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
3420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3430: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20  findIndexCol(.  
3440: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
3470: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3480: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
3490: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
34a0: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72  ion list to sear
34b0: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  ch */.  int iBas
34c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
34d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
34e0: 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f  r for table asso
34f0: 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
3500: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
3510: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
3520: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
3530: 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f  o match column o
3540: 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  f */.  int iCol 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
3570: 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74   of index to mat
3580: 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ch */.){.  int i
3590: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
35a0: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
35b0: 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66  Coll[iCol];..  f
35c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
35d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
35e0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
35f0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
3600: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
3610: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
3620: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
3630: 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75       && p->iColu
3640: 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
3650: 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26  mn[iCol].     &&
3660: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73   p->iTable==iBas
3670: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43  e.    ){.      C
3680: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
3690: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
36a0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
36b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
36c0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26       if( pColl &
36d0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
36e0: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
36f0: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
3700: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
3710: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3720: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
3730: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
3740: 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c 2d 74  UE if the iCol-t
3750: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
3760: 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20 4e 55  x pIdx is NOT NU
3770: 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  LL.*/.static int
3780: 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e   indexColumnNotN
3790: 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  ull(Index *pIdx,
37a0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   int iCol){.  in
37b0: 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t j;.  assert( p
37c0: 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Idx!=0 );.  asse
37d0: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
37e0: 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Col<pIdx->nColum
37f0: 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78 2d  n );.  j = pIdx-
3800: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b  >aiColumn[iCol];
3810: 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20  .  if( j>=0 ){. 
3820: 20 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e     return pIdx->
3830: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e  pTable->aCol[j].
3840: 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65  notNull;.  }else
3850: 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a   if( j==(-1) ){.
3860: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3870: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3880: 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20 20  t( j==(-2) );.  
3890: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
38a0: 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65 78 65  Assume an indexe
38b0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  d expression can
38c0: 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20 61 20   always yield a 
38d0: 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a  NULL */..  }.}..
38e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
38f0: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
3900: 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  T expression-lis
3910: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
3920: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  third argument.*
3930: 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * is redundant..
3940: 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54  **.** A DISTINCT
3950: 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
3960: 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  nt if any subset
3970: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
3980: 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54 49 4e  in the.** DISTIN
3990: 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f 6c 6c  CT list are coll
39a0: 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75 65 20  ectively unique 
39b0: 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 6c 79  and individually
39c0: 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74   non-null..*/.st
39d0: 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
39e0: 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20  nctRedundant(.  
39f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
3a10: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3a20: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
3a30: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ist,        /* T
3a40: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3a50: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
3a60: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
3a70: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
3a80: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
3a90: 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20  *pDistinct      
3aa0: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
3ab0: 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  et that needs to
3ac0: 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a   be DISTINCT */.
3ad0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
3ae0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
3af0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b     .  int iBase;
3b20: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
3b30: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
3b40: 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65   table or sub-se
3b50: 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  lect in the FROM
3b60: 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20   clause of.  ** 
3b70: 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
3b80: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
3b90: 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77  possible to show
3ba0: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
3bb0: 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  CT .  ** clause 
3bc0: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
3bd0: 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
3be0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
3bf0: 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70  n 0;.  iBase = p
3c00: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
3c10: 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20  ursor;.  pTab = 
3c20: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
3c30: 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  Tab;..  /* If an
3c40: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
3c50: 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63  ions is an IPK c
3c60: 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69  olumn on table i
3c70: 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72  Base, then retur
3c80: 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f  n .  ** true. No
3c90: 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62  te: The (p->iTab
3ca0: 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20  le==iBase) part 
3cb0: 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79  of this test may
3cc0: 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65   be false if the
3cd0: 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45  .  ** current SE
3ce0: 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c  LECT is a correl
3cf0: 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ated sub-query..
3d00: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
3d10: 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
3d20: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
3d30: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
3d40: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
3d50: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
3d60: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
3d70: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
3d80: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3d90: 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
3da0: 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
3db0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74    }..  /* Loop t
3dc0: 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63  hrough all indic
3dd0: 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  es on the table,
3de0: 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74   checking each t
3df0: 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65  o see if it make
3e00: 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49  s.  ** the DISTI
3e10: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65  NCT qualifier re
3e20: 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73  dundant. It does
3e30: 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a   so if:.  **.  *
3e40: 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78  *   1. The index
3e50: 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55   is itself UNIQU
3e60: 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a  E, and.  **.  **
3e70: 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65     2. All of the
3e80: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
3e90: 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72  index are either
3ea0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69   part of the pDi
3eb0: 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20  stinct.  **     
3ec0: 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74   list, or else t
3ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3ee0: 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20  contains a term 
3ef0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
3f00: 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77  =X",.  **      w
3f10: 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73  here X is a cons
3f20: 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20  tant value. The 
3f30: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
3f40: 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ces of the.  ** 
3f50: 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20       comparison 
3f60: 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  and select-list 
3f70: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
3f80: 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20   match those of 
3f90: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
3fa0: 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66    **   3. All of
3fb0: 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c   those index col
3fc0: 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
3fd0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3fe0: 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20  does not.  **   
3ff0: 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f     contain a "co
4000: 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75  l=X" term are su
4010: 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e  bject to a NOT N
4020: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ULL constraint..
4030: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
4040: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
4050: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
4060: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 21  Next){.    if( !
4070: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
4080: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
4090: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
40a0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
40b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  +){.      if( 0=
40c0: 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e  =sqlite3WhereFin
40d0: 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
40e0: 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30  , i, ~(Bitmask)0
40f0: 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29  , WO_EQ, pIdx) )
4100: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  {.        if( fi
4110: 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73  ndIndexCol(pPars
4120: 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42  e, pDistinct, iB
4130: 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c 30 20  ase, pIdx, i)<0 
4140: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4150: 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75 6d 6e   if( indexColumn
4160: 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20 69 29  NotNull(pIdx, i)
4170: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4180: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4190: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( i==pIdx->nKey
41a0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Col ){.      /* 
41b0: 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69  This index impli
41c0: 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54  es that the DIST
41d0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69  INCT qualifier i
41e0: 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
41f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4200: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
4210: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
4220: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
4230: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
4240: 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61  nput value to ba
4250: 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se 2..*/.static 
4260: 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f  LogEst estLog(Lo
4270: 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75 72  gEst N){.  retur
4280: 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73 71  n N<=10 ? 0 : sq
4290: 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20 2d  lite3LogEst(N) -
42a0: 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   33;.}../*.** Co
42b0: 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20  nvert OP_Column 
42c0: 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f 43 6f  opcodes to OP_Co
42d0: 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73 6c 79  py in previously
42e0: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 2e   generated code.
42f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4300: 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20 67 65  ine runs over ge
4310: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
4320: 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74 65 73  e and translates
4330: 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70   OP_Column.** op
4340: 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f 43 6f  codes into OP_Co
4350: 70 79 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c  py when the tabl
4360: 65 20 69 73 20 62 65 69 6e 67 20 61 63 63 65 73  e is being acces
4370: 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75 74 69  sed via co-routi
4380: 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  ne .** instead o
4390: 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f 6b  f via table look
43a0: 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  up..**.** If the
43b0: 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61 72 61   bIncrRowid para
43c0: 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
43d0: 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20 69 6e   any OP_Rowid in
43e0: 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a  structions on.**
43f0: 20 63 75 72 73 6f 72 20 69 54 61 62 43 75 72 20   cursor iTabCur 
4400: 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20  are transformed 
4410: 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20 4f 72  into OP_Null. Or
4420: 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69 64 20  , if bIncrRowid 
4430: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20  is non-zero,.** 
4440: 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52 6f 77  then each OP_Row
4450: 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  id is transforme
4460: 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 72 75  d into an instru
4470: 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65 6d 65  ction to increme
4480: 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  nt the.** value 
4490: 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20 6f 75  stored in its ou
44a0: 74 70 75 74 20 72 65 67 69 73 74 65 72 2e 0a 2a  tput register..*
44b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
44c0: 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43  anslateColumnToC
44d0: 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  opy(.  Vdbe *v, 
44e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
44f0: 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e 69 6e  e VDBE containin
4500: 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e 73 6c  g code to transl
4510: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ate */.  int iSt
4520: 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  art,         /* 
4530: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 74  Translate from t
4540: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  his opcode to th
4550: 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  e end */.  int i
4560: 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20 2f  TabCur,        /
4570: 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52  * OP_Column/OP_R
4580: 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73 20  owid references 
4590: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
45a0: 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65 72  .  int iRegister
45b0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ,      /* The fi
45c0: 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  rst column is in
45d0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
45e0: 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f 77  /.  int bIncrRow
45f0: 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  id      /* If no
4600: 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f 72  n-zero, transfor
4610: 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f 50  m OP_rowid to OP
4620: 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29 7b  _AddImm(1) */.){
4630: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  .  VdbeOp *pOp =
4640: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
4650: 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  p(v, iStart);.  
4660: 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  int iEnd = sqlit
4670: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4680: 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20 69 53  r(v);.  for(; iS
4690: 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74 61 72  tart<iEnd; iStar
46a0: 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  t++, pOp++){.   
46b0: 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54   if( pOp->p1!=iT
46c0: 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
46d0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
46e0: 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
46f0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f   ){.      pOp->o
4700: 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b  pcode = OP_Copy;
4710: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d  .      pOp->p1 =
4720: 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65 67 69   pOp->p2 + iRegi
4730: 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ster;.      pOp-
4740: 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  >p2 = pOp->p3;. 
4750: 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30       pOp->p3 = 0
4760: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4770: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4780: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Rowid ){.      i
4790: 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20 29 7b  f( bIncrRowid ){
47a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  .        /* Incr
47b0: 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
47c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 32  stored in the P2
47d0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
47e0: 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20 20 20  OP_Rowid. */.   
47f0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4800: 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a 20 20   = OP_AddImm;.  
4810: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
4820: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
4830: 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a 20 20   pOp->p2 = 1;.  
4840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4850: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
4860: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
4870: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a 20    pOp->p1 = 0;. 
4880: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d         pOp->p3 =
4890: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
48a0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
48b0: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
48c0: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
48d0: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
48e0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
48f0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
4900: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
4910: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
4920: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
4930: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
4940: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
4950: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
4960: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
4970: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
4980: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4990: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
49a0: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
49b0: 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
49c0: 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69  BLED).static voi
49d0: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
49e0: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
49f0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
4a00: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
4a10: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
4a20: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
4a30: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
4a40: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
4a50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4a60: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
4a70: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
4a80: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
4a90: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
4aa0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
4ab0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
4ac0: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
4ad0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4ae0: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
4af0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
4b00: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
4b10: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
4b20: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
4b30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
4b40: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
4b50: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4b60: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
4b70: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
4b80: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
4b90: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
4ba0: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
4bb0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
4bc0: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
4bd0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
4be0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
4bf0: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
4c00: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
4c10: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
4c20: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
4c30: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
4c40: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
4c50: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
4c60: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4c70: 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
4c80: 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
4c90: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
4ca0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4cb0: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
4cc0: 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
4cd0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
4ce0: 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
4cf0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
4d00: 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
4d10: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
4d20: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
4d30: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
4d40: 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
4d50: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
4d60: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
4d70: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
4d80: 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
4d90: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
4da0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4db0: 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
4dc0: 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
4dd0: 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69  tedCost);.  sqli
4de0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4df0: 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d    estimatedRows=
4e00: 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  %lld\n", p->esti
4e10: 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65  matedRows);.}.#e
4e20: 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43  lse.#define TRAC
4e30: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a  E_IDX_INPUTS(A).
4e40: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
4e50: 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e  X_OUTPUTS(A).#en
4e60: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
4e70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
4e80: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52  IC_INDEX./*.** R
4e90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
4ea0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4eb0: 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20  erm pTerm is of 
4ec0: 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a  a form where it.
4ed0: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ** could be used
4ee0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74   with an index t
4ef0: 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61  o access pSrc, a
4f00: 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f  ssuming an appro
4f10: 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20  priate.** index 
4f20: 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  existed..*/.stat
4f30: 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72  ic int termCanDr
4f40: 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  iveIndex(.  Wher
4f50: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
4f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
4f70: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
4f80: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74  to check */.  st
4f90: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
4fa0: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
4fb0: 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79  Table we are try
4fc0: 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f  ing to access */
4fd0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
4fe0: 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ady             
4ff0: 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f    /* Tables in o
5000: 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68  uter loops of th
5010: 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63  e join */.){.  c
5020: 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70  har aff;.  if( p
5030: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
5040: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
5050: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5060: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
5070: 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
5080: 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  IS))==0 ) return
5090: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
50a0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
50b0: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
50c0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
50d0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
50e0: 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  mn<0 ) return 0;
50f0: 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70  .  aff = pSrc->p
5100: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d  Tab->aCol[pTerm-
5110: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61  >u.leftColumn].a
5120: 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21  ffinity;.  if( !
5130: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
5140: 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45  nityOk(pTerm->pE
5150: 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75  xpr, aff) ) retu
5160: 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73 65  rn 0;.  testcase
5170: 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
5180: 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 72  op==TK_IS );.  r
5190: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
51a0: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
51b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
51c0: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65  C_INDEX./*.** Ge
51d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
51e0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
51f0: 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e  ex object for an
5200: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
5210: 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75  .** and to set u
5220: 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c  p the WhereLevel
5230: 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73   object pLevel s
5240: 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  o that the code 
5250: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b  generator.** mak
5260: 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75  es use of the au
5270: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a  tomatic index..*
5280: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
5290: 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
52a0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
52b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
52c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
52d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
52e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
52f0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
5300: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
5310: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
5320: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
5330: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
5340: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74  ause term to get
5350: 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20   the next index 
5360: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
5370: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
5380: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
5390: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
53a0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
53b0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
53c0: 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  el          /* W
53d0: 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68  rite new index h
53e0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
53f0: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
5400: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5410: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
5420: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20  the constructed 
5430: 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
5440: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
5450: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
5460: 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
5470: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
5480: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
5490: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
54a0: 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
54b0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
54c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54d0: 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
54e0: 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
54f0: 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
5500: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
5510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
5520: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
5530: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
5540: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
5550: 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
5560: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5570: 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
5580: 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
5590: 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
55a0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
55b0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
55c0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
55d0: 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
5600: 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
5610: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5630: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
5640: 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
5650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
5680: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
56b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
56c0: 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
56d0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
56e0: 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
56f0: 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
5700: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
5710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
5720: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5730: 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
5740: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
5750: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
5760: 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
5770: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
5780: 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  NotUsed;        
5790: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
57a0: 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ace on the end o
57b0: 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d  f pIdx */.  Bitm
57c0: 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
57d0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
57e0: 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
57f0: 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
5800: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
5810: 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
5820: 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
5830: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
5840: 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e  */.  u8 sentWarn
5850: 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ing = 0;        
5860: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61   /* True if a wa
5870: 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20  rnning has been 
5880: 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72  issued */.  Expr
5890: 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20   *pPartial = 0; 
58a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69          /* Parti
58b0: 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73  al Index Express
58c0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ion */.  int iCo
58d0: 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20  ntinue = 0;     
58e0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
58f0: 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64  e to skip exclud
5900: 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74 72  ed rows */.  str
5910: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5920: 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
5930: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
5940: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
5950: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 75 6e  /.  int addrCoun
5960: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
5970: 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65 72 65  /* Address where
5980: 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74 65 72   integer counter
5990: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
59a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
59b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
59c0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67   /* Array of reg
59d0: 69 73 74 65 72 73 20 77 68 65 72 65 20 72 65 63  isters where rec
59e0: 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c 65 64  ord is assembled
59f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61   */..  /* Genera
5a00: 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20  te code to skip 
5a10: 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69 6f  over the creatio
5a20: 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61  n and initializa
5a30: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
5a40: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
5a50: 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73   on 2nd and subs
5a60: 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
5a70: 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a  s of the loop. *
5a80: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
5a90: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
5aa0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72 49   v!=0 );.  addrI
5ab0: 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
5ac0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
5ad0: 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
5ae0: 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  e(v);..  /* Coun
5af0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5b00: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
5b10: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
5b20: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
5b30: 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
5b40: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
5b50: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65  traints */.  nKe
5b60: 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  yCol = 0;.  pTab
5b70: 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
5b80: 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
5b90: 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
5ba0: 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
5bb0: 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78  l->pWLoop;.  idx
5bc0: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Cols = 0;.  for(
5bd0: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
5be0: 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72  erm<pWCEnd; pTer
5bf0: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
5c00: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
5c10: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
5c20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5c30: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
5c40: 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65  mJoin)    /* pre
5c50: 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a  req always non-z
5c60: 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ero */.         
5c70: 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
5c80: 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d  JoinTable!=pSrc-
5c90: 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20  >iCursor   /*   
5ca0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61  for the right-ha
5cb0: 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  nd   */.        
5cc0: 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65   || pLoop->prere
5cd0: 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  q!=0 );         
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
5cf0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
5d00: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   JOIN */.    if(
5d10: 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d   pLoop->prereq==
5d20: 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
5d30: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
5d40: 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20  _VIRTUAL)==0.   
5d50: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
5d60: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5d70: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
5d80: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  & sqlite3ExprIsT
5d90: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78  ableConstant(pEx
5da0: 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  pr, pSrc->iCurso
5db0: 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  r) ){.      pPar
5dc0: 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  tial = sqlite3Ex
5dd0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
5de0: 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20 20  , pPartial,.    
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5e10: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
5e20: 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
5e30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5e40: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
5e50: 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
5e60: 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
5e70: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
5e80: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
5e90: 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
5ea0: 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
5eb0: 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
5ec0: 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
5ed0: 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
5ee0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
5ef0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5f00: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
5f10: 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74  .      if( !sent
5f20: 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20  Warning ){.     
5f30: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5f40: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
5f50: 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20  TOINDEX,.       
5f60: 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20       "automatic 
5f70: 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22  index on %s(%s)"
5f80: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
5f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
5fa0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  ble->aCol[iCol].
5fb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
5fc0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b  sentWarning = 1;
5fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5fe0: 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
5ff0: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
6000: 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
6010: 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
6020: 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f  b, pLoop, nKeyCo
6030: 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l+1) ){.        
6040: 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f    goto end_auto_
6050: 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20  index_create;.  
6060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6070: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b  pLoop->aLTerm[nK
6080: 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d  eyCol++] = pTerm
6090: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
60a0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
60b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
60c0: 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e  assert( nKeyCol>
60d0: 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  0 );.  pLoop->u.
60e0: 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f  btree.nEq = pLoo
60f0: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79  p->nLTerm = nKey
6100: 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  Col;.  pLoop->ws
6110: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
6120: 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
6130: 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
6140: 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20  _INDEXED.       
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
6160: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
6170: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
6180: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69  e number of addi
6190: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
61a0: 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20  eeded to create 
61b0: 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20  a.  ** covering 
61c0: 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72  index.  A "cover
61d0: 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e  ing index" is an
61e0: 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
61f0: 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f  ains all.  ** co
6200: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
6210: 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65  eeded by the que
6220: 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65  ry.  With a cove
6230: 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a  ring index, the.
6240: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
6250: 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ble never needs 
6260: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20  to be accessed. 
6270: 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   Automatic indic
6280: 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
6290: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
62a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64   because the ind
62b0: 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  ex will not be u
62c0: 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20  pdated if the.  
62d0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
62e0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68  e changes and th
62f0: 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
6300: 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65  e cannot both be
6310: 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68   used.  ** if th
6320: 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e  ey go out of syn
6330: 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43  c..  */.  extraC
6340: 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  ols = pSrc->colU
6350: 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20  sed & (~idxCols 
6360: 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  | MASKBIT(BMS-1)
6370: 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
6380: 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65  MIN(BMS-1,pTable
6390: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63  ->nCol);.  testc
63a0: 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
63b0: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
63c0: 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
63d0: 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
63e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
63f0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
6400: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
6410: 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65  MASKBIT(i) ) nKe
6420: 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  yCol++;.  }.  if
6430: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
6440: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
6450: 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20   ){.    nKeyCol 
6460: 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
6470: 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a  - BMS + 1;.  }..
6480: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
6490: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
64a0: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73  to describe this
64b0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78   index */.  pIdx
64c0: 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
64d0: 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50  teIndexObject(pP
64e0: 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f  arse->db, nKeyCo
64f0: 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65  l+1, 0, &zNotUse
6500: 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  d);.  if( pIdx==
6510: 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74  0 ) goto end_aut
6520: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a  o_index_create;.
6530: 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
6540: 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
6550: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20    pIdx->zName = 
6560: 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20  "auto-index";.  
6570: 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
6580: 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
6590: 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
65a0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
65b0: 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
65c0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
65d0: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
65e0: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
65f0: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
6600: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
6610: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
6620: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
6630: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
6640: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
6650: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
6660: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
6670: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
6680: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
6690: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
66a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
66b0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
66c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
66d0: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
66e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
66f0: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
6700: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
6710: 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
6720: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
6730: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
6740: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
6750: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
6760: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
6770: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
6780: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
6790: 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  l[n] = pColl ? p
67a0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71  Coll->zName : sq
67b0: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
67c0: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
67d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
67e0: 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
67f0: 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
6800: 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
6810: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
6820: 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
6830: 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
6840: 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
6850: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6860: 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
6870: 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
6880: 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
6890: 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
68a0: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
68b0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
68c0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
68d0: 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33  oll[n] = sqlite3
68e0: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
68f0: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
6900: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
6910: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
6920: 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  S-1) ){.    for(
6930: 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c  i=BMS-1; i<pTabl
6940: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
6950: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
6960: 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
6970: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
6980: 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
6990: 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  NARY;.      n++;
69a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
69b0: 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20  ert( n==nKeyCol 
69c0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
69d0: 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49  umn[n] = XN_ROWI
69e0: 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  D;.  pIdx->azCol
69f0: 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[n] = sqlite3St
6a00: 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20 43  rBINARY;..  /* C
6a10: 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
6a20: 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  tic index */.  a
6a30: 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
6a40: 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
6a50: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
6a60: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
6a70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6a80: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp2(v, OP_OpenA
6a90: 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
6aa0: 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43  ->iIdxCur, nKeyC
6ab0: 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ol+1);.  sqlite3
6ac0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6ad0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
6ae0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
6af0: 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62  , "for %s", pTab
6b00: 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  le->zName));..  
6b10: 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f  /* Fill the auto
6b20: 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68  matic index with
6b30: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71   content */.  sq
6b40: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
6b50: 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  sh(pParse);.  pT
6b60: 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e 70  abItem = &pWC->p
6b70: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
6b80: 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
6b90: 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  ];.  if( pTabIte
6ba0: 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
6bb0: 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  ne ){.    int re
6bc0: 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65  gYield = pTabIte
6bd0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
6be0: 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d 20    addrCounter = 
6bf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c00: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6c10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6c20: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6c30: 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
6c40: 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
6c50: 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
6c60: 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64 72  llSub);.    addr
6c70: 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56 64  Top =  sqlite3Vd
6c80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
6c90: 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b  ield, regYield);
6ca0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6cb0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
6cc0: 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
6cd0: 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c 20  row of \"%s\"", 
6ce0: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
6cf0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  zName));.  }else
6d00: 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  {.    addrTop = 
6d10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d20: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
6d30: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
6d40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6d50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
6d60: 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43 6f  rtial ){.    iCo
6d70: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
6d80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6d90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6da0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
6db0: 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e 74   pPartial, iCont
6dc0: 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  inue, SQLITE_JUM
6dd0: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 4c  PIFNULL);.    pL
6de0: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
6df0: 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44 58  WHERE_PARTIALIDX
6e00: 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f 72  ;.  }.  regRecor
6e10: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
6e20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6e30: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
6e40: 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
6e50: 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ey(.      pParse
6e60: 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
6e70: 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
6e80: 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a 20  rd, 0, 0, 0, 0. 
6e90: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
6ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6eb0: 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
6ec0: 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
6ed0: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
6ee0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6ef0: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
6f00: 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
6f10: 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
6f20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6f30: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
6f40: 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67  if( pTabItem->fg
6f50: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b  .viaCoroutine ){
6f60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f70: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
6f80: 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73 65  Counter, regBase
6f90: 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61  +n);.    transla
6fa0: 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76  teColumnToCopy(v
6fb0: 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65  , addrTop, pLeve
6fc0: 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61 62  l->iTabCur, pTab
6fd0: 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
6fe0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
6ff0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
7000: 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62 49 74  Top);.    pTabIt
7010: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
7020: 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
7030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7040: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7050: 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
7060: 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
7070: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7080: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
7090: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
70a0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
70b0: 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
70c0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
70d0: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
70e0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
70f0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7100: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
7110: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
7120: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20  p(pParse);.  .  
7130: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
7140: 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
7150: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
7160: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
7170: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
7180: 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69  it);..end_auto_i
7190: 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20 20 73  ndex_create:.  s
71a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
71b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
71c0: 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  rtial);.}.#endif
71d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
71e0: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
71f0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7200: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7210: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
7220: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
7230: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
7240: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7250: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
7260: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
7270: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
7280: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
7290: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
72a0: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
72b0: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
72c0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
72d0: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
72e0: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
72f0: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
7300: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
7310: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
7320: 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
7330: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
7340: 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
7350: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7360: 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d 73 20  /* Ignore terms 
7370: 77 69 74 68 20 74 68 65 73 65 20 70 72 65 72 65  with these prere
7380: 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  qs */.  struct S
7390: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
73a0: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
73b0: 4f 72 64 65 72 42 79 2c 0a 20 20 75 31 36 20 2a  OrderBy,.  u16 *
73c0: 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20 20 20  pmNoOmit        
73d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
73e0: 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20  sk of terms not 
73f0: 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20  to omit */.){.  
7400: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
7410: 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20  nTerm;.  struct 
7420: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7430: 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
7440: 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
7450: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
7460: 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b  by *pIdxOrderBy;
7470: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7480: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7490: 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
74a0: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
74b0: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  Term;.  int nOrd
74c0: 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f  erBy;.  sqlite3_
74d0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
74e0: 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f  Info;.  u16 mNoO
74f0: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  mit = 0;..  /* C
7500: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
7510: 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
7520: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
7530: 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
7540: 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74   ** to this virt
7550: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ual table */.  f
7560: 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54  or(i=nTerm=0, pT
7570: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
7580: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
7590: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
75a0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
75b0: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
75c0: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
75d0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
75e0: 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e  rereqRight & mUn
75f0: 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75  usable ) continu
7600: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
7610: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
7620: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7630: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
7640: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7650: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7660: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    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 4e 55 4c  rator & WO_ISNUL
7690: 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
76a0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
76b0: 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  tor & WO_IS );. 
76c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
76d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
76e0: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
76f0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
7700: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
7710: 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53  L|WO_EQUIV|WO_IS
7720: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
7730: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7740: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7750: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
7760: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
7770: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
7780: 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e  n>=(-1) );.    n
7790: 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  Term++;.  }..  /
77a0: 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42  * If the ORDER B
77b0: 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  Y clause contain
77c0: 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69  s only columns i
77d0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  n the current . 
77e0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
77f0: 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  e then allocate 
7800: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f  space for the aO
7810: 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20  rderBy part of. 
7820: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f   ** the sqlite3_
7830: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7840: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72  ture..  */.  nOr
7850: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28  derBy = 0;.  if(
7860: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
7870: 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42   int n = pOrderB
7880: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f  y->nExpr;.    fo
7890: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
78a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
78b0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
78c0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
78d0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
78e0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
78f0: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
7900: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
7910: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
7920: 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e  ( i==n){.      n
7930: 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20  OrderBy = n;.   
7940: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
7950: 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
7960: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
7970: 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49  ucture.  */.  pI
7980: 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  dxInfo = sqlite3
7990: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
79a0: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
79b0: 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20  *pIdxInfo).     
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28        + (sizeof(
79e0: 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a  *pIdxCons) + siz
79f0: 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54  eof(*pUsage))*nT
7a00: 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  erm.            
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
7a20: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64   sizeof(*pIdxOrd
7a30: 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29  erBy)*nOrderBy )
7a40: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
7a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7a60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7a70: 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
7a80: 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  y");.    return 
7a90: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  0;.  }..  /* Ini
7aa0: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75  tialize the stru
7ab0: 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69  cture.  The sqli
7ac0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
7ad0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
7ae0: 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c  s.  ** many fiel
7af0: 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c  ds that are decl
7b00: 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20  ared "const" to 
7b10: 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64  prevent xBestInd
7b20: 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61  ex from.  ** cha
7b30: 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
7b40: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
7b50: 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
7b60: 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69   order to.  ** i
7b70: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
7b80: 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70  fields..  */.  p
7b90: 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
7ba0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7bb0: 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
7bc0: 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78  xInfo[1];.  pIdx
7bd0: 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63  OrderBy = (struc
7be0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7bf0: 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f  orderby*)&pIdxCo
7c00: 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73  ns[nTerm];.  pUs
7c10: 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71  age = (struct sq
7c20: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7c30: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70  traint_usage*)&p
7c40: 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65  IdxOrderBy[nOrde
7c50: 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  rBy];.  *(int*)&
7c60: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
7c70: 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20  raint = nTerm;. 
7c80: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
7c90: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
7ca0: 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
7cb0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7cc0: 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
7cd0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
7ce0: 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b  aint = pIdxCons;
7cf0: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7d00: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7d10: 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
7d20: 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
7d30: 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
7d40: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7d50: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
7d60: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
7d70: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
7d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66      pUsage;..  f
7dd0: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
7de0: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
7df0: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
7e00: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a  ++){.    u8 op;.
7e10: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
7e20: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
7e30: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
7e40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
7e50: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
7e60: 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20  t & mUnusable ) 
7e70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
7e80: 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
7e90: 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
7ea0: 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
7eb0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7ec0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7ed0: 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
7ee0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7ef0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7f00: 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IS );.    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 49 53 4e 55  erator & WO_ISNU
7f30: 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
7f40: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7f50: 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b  ator & WO_ALL );
7f60: 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
7f70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57  >eOperator & ~(W
7f80: 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49  O_ISNULL|WO_EQUI
7f90: 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63  V|WO_IS))==0 ) c
7fa0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7fb0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
7fc0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
7fd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7fe0: 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ert( pTerm->u.le
7ff0: 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29  ftColumn>=(-1) )
8000: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
8010: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
8020: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
8030: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
8040: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
8050: 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70  ;.    op = (u8)p
8060: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8070: 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  & WO_ALL;.    if
8080: 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70  ( op==WO_IN ) op
8090: 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66   = WO_EQ;.    if
80a0: 28 20 6f 70 3d 3d 57 4f 5f 4d 41 54 43 48 20 29  ( op==WO_MATCH )
80b0: 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 70 54 65  {.      op = pTe
80c0: 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20  rm->eMatchOp;.  
80d0: 20 20 7d 0a 20 20 20 20 70 49 64 78 43 6f 6e 73    }.    pIdxCons
80e0: 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20  [j].op = op;.   
80f0: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
8100: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
8110: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
8120: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
8130: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
8140: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
8150: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8160: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
8170: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
8180: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
8190: 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68  sserts verify th
81a0: 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20  is fact. */.    
81b0: 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
81c0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
81d0: 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
81e0: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
81f0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8200: 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
8210: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
8220: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8230: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
8240: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
8250: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8260: 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
8270: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
8280: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
8290: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
82a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
82b0: 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
82c0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
82d0: 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65  ATCH );.    asse
82e0: 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
82f0: 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
8300: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
8310: 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
8320: 41 54 43 48 29 20 29 3b 0a 0a 20 20 20 20 69 66  ATCH) );..    if
8330: 28 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ( op & (WO_LT|WO
8340: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  _LE|WO_GT|WO_GE)
8350: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
8360: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 54 65  ExprIsVector(pTe
8370: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
8380: 74 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t) .    ){.     
8390: 20 69 66 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f   if( i<16 ) mNoO
83a0: 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b  mit |= (1 << i);
83b0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  .      if( op==W
83c0: 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e 73 5b  O_LT ) pIdxCons[
83d0: 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20  j].op = WO_LE;. 
83e0: 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f       if( op==WO_
83f0: 47 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  GT ) pIdxCons[j]
8400: 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20  .op = WO_GE;.   
8410: 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d   }..    j++;.  }
8420: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
8430: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
8440: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
8450: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
8460: 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72  Expr;.    pIdxOr
8470: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
8480: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
8490: 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  n;.    pIdxOrder
84a0: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
84b0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
84c0: 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70  Order;.  }..  *p
84d0: 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69  mNoOmit = mNoOmi
84e0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  t;.  return pIdx
84f0: 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
8500: 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
8510: 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
8520: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
8530: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
8540: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
8550: 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
8560: 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
8570: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
8580: 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
8590: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
85a0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
85b0: 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
85c0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62  e3_index_info ob
85d0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d  ject that.** com
85e0: 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72 64  es in as the 3rd
85f0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
8600: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
8610: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8620: 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20  curs, pParse is 
8630: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
8640: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8650: 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  and a.** non-zer
8660: 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  o value is retur
8670: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
8680: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  0 is returned an
8690: 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
86a0: 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69  part of the sqli
86b0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
86c0: 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74  tructure is left
86d0: 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a   populated..**.*
86e0: 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
86f0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
8700: 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65  urned, it is the
8710: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
8720: 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  of the.** caller
8730: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
8740: 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66  ree p->idxStr if
8750: 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
8760: 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a  xStr indicates.*
8770: 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72  * that this is r
8780: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
8790: 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49  ic int vtabBestI
87a0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
87b0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
87c0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
87d0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  nfo *p){.  sqlit
87e0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
87f0: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
8800: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
8810: 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e  ab)->pVtab;.  in
8820: 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
8830: 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
8840: 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
8850: 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
8860: 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
8870: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
8880: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
8890: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
88a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
88b0: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MEM ){.      sql
88c0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61  ite3OomFault(pPa
88d0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65  rse->db);.    }e
88e0: 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
88f0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
8900: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8910: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
8920: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
8930: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8940: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8950: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
8960: 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
8970: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
8980: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
8990: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
89a0: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
89b0: 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54  0;..#if 0.  /* T
89c0: 68 69 73 20 65 72 72 6f 72 20 69 73 20 6e 6f 77  his error is now
89d0: 20 63 61 75 67 68 74 20 62 79 20 74 68 65 20 63   caught by the c
89e0: 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53 65 61 72  aller..  ** Sear
89f0: 63 68 20 66 6f 72 20 22 78 42 65 73 74 49 6e 64  ch for "xBestInd
8a00: 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 20  ex malfunction" 
8a10: 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f 72 28 69  below */.  for(i
8a20: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
8a30: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
8a40: 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
8a50: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
8a60: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
8a70: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
8a80: 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
8a90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8aa0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
8ab0: 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
8ac0: 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
8ad0: 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
8ae0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
8af0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
8b00: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
8b10: 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66  ->nErr;.}.#endif
8b20: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
8b30: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8b40: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65  TABLE) */..#ifde
8b50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8b60: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
8b70: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
8b80: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
8b90: 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
8ba0: 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
8bb0: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
8bc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
8bd0: 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
8be0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
8bf0: 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
8c00: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
8c10: 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65 63 0a   less than pRec.
8c20: 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
8c30: 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
8c40: 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
8c50: 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pRec.**.** Retu
8c60: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
8c70: 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61 74 20  the sample that 
8c80: 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  is the smallest 
8c90: 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69  sample that.** i
8ca0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
8cb0: 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 2e  r equal to pRec.
8cc0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
8cd0: 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61 6e 20  index is not an 
8ce0: 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68  index.** into th
8cf0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
8d00: 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69 6e 64  y - it is an ind
8d10: 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74 75 61  ex into a virtua
8d20: 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  l set of samples
8d30: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
8d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 53 61   contents of aSa
8d50: 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e  mple[] and the n
8d60: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
8d70: 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52  in record .** pR
8d80: 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ec. .*/.static i
8d90: 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  nt whereKeyStats
8da0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8db0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
8dc0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
8dd0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
8de0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
8df0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8e00: 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
8e10: 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61  ain of */.  Unpa
8e20: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
8e30: 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f  ,       /* Vecto
8e40: 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 63  r of values to c
8e50: 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
8e60: 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
8e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
8e80: 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
8e90: 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
8ea0: 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
8eb0: 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
8ec0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
8ed0: 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
8ee0: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70  /.){.  IndexSamp
8ef0: 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49  le *aSample = pI
8f00: 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69  dx->aSample;.  i
8f10: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
8f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8f30: 64 65 78 20 6f 66 20 72 65 71 75 69 72 65 64 20  dex of required 
8f40: 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20  stats in anEq[] 
8f50: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  etc. */.  int i;
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8f80: 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 3e  f first sample >
8f90: 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20  = pRec */.  int 
8fa0: 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  iSample;        
8fb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
8fc0: 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72 67 65  est sample large
8fd0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
8fe0: 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74  to pRec */.  int
8ff0: 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20   iMin = 0;      
9000: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c           /* Smal
9010: 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20  lest sample not 
9020: 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  yet tested */.  
9030: 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
9040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9050: 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
9060: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
9090: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
90a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
90b0: 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Field;          
90c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
90d0: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 70 52   of fields in pR
90e0: 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  ec */.  tRowcnt 
90f0: 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20 20 20  iLower = 0;     
9100: 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20      /* anLt[] + 
9110: 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73  anEq[] of larges
9120: 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20 69 73  t sample pRec is
9130: 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53   > */..#ifndef S
9140: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
9150: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
9160: 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64 69 66  pParse );.#endif
9170: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 21  .  assert( pRec!
9180: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9190: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  pIdx->nSample>0 
91a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
91b0: 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 70  c->nField>0 && p
91c0: 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64  Rec->nField<=pId
91d0: 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b  x->nSampleCol );
91e0: 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61  ..  /* Do a bina
91f0: 72 79 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e  ry search to fin
9200: 64 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  d the first samp
9210: 6c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  le greater than 
9220: 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f  or equal.  ** to
9230: 20 70 52 65 63 2e 20 49 66 20 70 52 65 63 20 63   pRec. If pRec c
9240: 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
9250: 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65 74 20   field, the set 
9260: 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20 73 65  of samples to se
9270: 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d  arch.  ** is sim
9280: 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  ply the aSample[
9290: 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20  ] array. If the 
92a0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
92b0: 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  le[] contain mor
92c0: 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20  e.  ** than one 
92d0: 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c  fields, all fiel
92e0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ds following the
92f0: 20 66 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72   first are ignor
9300: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
9310: 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e   pRec contains N
9320: 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65 20 4e   fields, where N
9330: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
9340: 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c 6c 20  e, then as well 
9350: 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70  as the.  ** samp
9360: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
9370: 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f 20 4e   (truncated to N
9380: 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20 73 65   fields), the se
9390: 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20 74 6f  arch also has to
93a0: 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70  .  ** consider p
93b0: 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f 73 65  refixes of those
93c0: 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78   samples. For ex
93d0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 73 65  ample, if the se
93e0: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a  t of samples.  *
93f0: 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a  * in aSample is:
9400: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61  .  **.  **     a
9410: 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20  Sample[0] = (a, 
9420: 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61  5) .  **     aSa
9430: 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30  mple[1] = (a, 10
9440: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
9450: 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20  ple[2] = (b, 5) 
9460: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
9470: 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30 29 20  e[3] = (c, 100) 
9480: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
9490: 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a  e[4] = (c, 105).
94a0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
94b0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
94c0: 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79 20 62  should ideally b
94d0: 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20 61 62  e the samples ab
94e0: 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ove and the .  *
94f0: 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 65  * unique prefixe
9500: 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b  s [a], [b] and [
9510: 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20 74 68  c]. But since th
9520: 61 74 20 69 73 20 68 61 72 64 20 74 6f 20 6f 72  at is hard to or
9530: 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68  ganize, .  ** th
9540: 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c 79 20  e code actually 
9550: 73 65 61 72 63 68 65 73 20 74 68 69 73 20 73 65  searches this se
9560: 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  t:.  **.  **    
9570: 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20 20 20   0: (a) .  **   
9580: 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a    1: (a, 5) .  *
9590: 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31 30 29  *     2: (a, 10)
95a0: 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20 28 61   .  **     3: (a
95b0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
95c0: 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20 20 20  4: (b) .  **    
95d0: 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a   5: (b, 5) .  **
95e0: 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20 20 2a       6: (c) .  *
95f0: 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31 30 30  *     7: (c, 100
9600: 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a 20 28  ) .  **     8: (
9610: 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20 20 20  c, 105).  **    
9620: 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   9: (c, 105).  *
9630: 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  *.  ** For each 
9640: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 53  sample in the aS
9650: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e  ample[] array, N
9660: 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70 72 65   samples are pre
9670: 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a  sent in the.  **
9680: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
9690: 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68 65 20  e array. In the 
96a0: 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73 20 30  above, samples 0
96b0: 20 61 6e 64 20 31 20 61 72 65 20 62 61 73 65 64   and 1 are based
96c0: 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65   on .  ** sample
96d0: 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d   aSample[0]. Sam
96e0: 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f 6e 20  ples 2 and 3 on 
96f0: 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a  aSample[1] etc..
9700: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c    **.  ** Often,
9710: 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65 61 63   sample i of eac
9720: 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66  h block of N eff
9730: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73 20 68  ective samples h
9740: 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64 73 2e  as (i+1) fields.
9750: 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 65 61  .  ** Except, ea
9760: 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65  ch sample may be
9770: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65 6e 73   extended to ens
9780: 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20 67  ure that it is g
9790: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 0a 20  reater than or. 
97a0: 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65   ** equal to the
97b0: 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70 6c 65   previous sample
97c0: 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 46   in the array. F
97d0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74  or example, in t
97e0: 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20  he above, .  ** 
97f0: 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68 65 20  sample 2 is the 
9800: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f 66 20  first sample of 
9810: 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d  a block of N sam
9820: 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69 72 73  ples, so at firs
9830: 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70 65 61  t it .  ** appea
9840: 72 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  rs that it shoul
9850: 64 20 62 65 20 31 20 66 69 65 6c 64 20 69 6e 20  d be 1 field in 
9860: 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c 20 74  size. However, t
9870: 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69  hat would make i
9880: 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20  t .  ** smaller 
9890: 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73  than sample 1, s
98a0: 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
98b0: 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f  rch would not wo
98c0: 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c  rk. As a result,
98d0: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 74   .  ** it is ext
98e0: 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66 69 65  ended to two fie
98f0: 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69 63 61  lds. The duplica
9900: 74 65 73 20 74 68 61 74 20 74 68 69 73 20 63 72  tes that this cr
9910: 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20  eates do not .  
9920: 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
9930: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46  blems..  */.  nF
9940: 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69  ield = pRec->nFi
9950: 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b  eld;.  iCol = 0;
9960: 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70 49 64  .  iSample = pId
9970: 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69  x->nSample * nFi
9980: 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  eld;.  do{.    i
9990: 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20 20 20  nt iSamp;       
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99b0: 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70 6c 65  Index in aSample
99c0: 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d 70 6c  [] of test sampl
99d0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20  e */.    int n; 
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9a00: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 65   of fields in te
9a10: 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20  st sample */..  
9a20: 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b    iTest = (iMin+
9a30: 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20  iSample)/2;.    
9a40: 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20 2f 20  iSamp = iTest / 
9a50: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20  nField;.    if( 
9a60: 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20  iSamp>0 ){.     
9a70: 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73 65 64   /* The proposed
9a80: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
9a90: 65 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  e is a prefix of
9aa0: 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b   sample aSample[
9ab0: 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a  iSamp]..      **
9ac0: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
9ad0: 68 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66  he shortest pref
9ae0: 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28  ix of at least (
9af0: 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65 6c 64  1 + iTest%nField
9b00: 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 65 6c  ) .      ** fiel
9b10: 64 73 20 74 68 61 74 20 69 73 20 67 72 65 61 74  ds that is great
9b20: 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  er than the prev
9b30: 69 6f 75 73 20 65 66 66 65 63 74 69 76 65 20 73  ious effective s
9b40: 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  ample.  */.     
9b50: 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20 25 20   for(n=(iTest % 
9b60: 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e  nField) + 1; n<n
9b70: 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20  Field; n++){.   
9b80: 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
9b90: 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e  [iSamp-1].anLt[n
9ba0: 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61  -1]!=aSample[iSa
9bb0: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20  mp].anLt[n-1] ) 
9bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9be0: 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b 0a 20  n = iTest + 1;. 
9bf0: 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e     }..    pRec->
9c00: 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20  nField = n;.    
9c10: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
9c20: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
9c30: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c  Sample[iSamp].n,
9c40: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9c50: 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66  p, pRec);.    if
9c60: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
9c70: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
9c80: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
9c90: 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61  1] + aSample[iSa
9ca0: 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20  mp].anEq[n-1];. 
9cb0: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9cc0: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t+1;.    }else i
9cd0: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e  f( res==0 && n<n
9ce0: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 69  Field ){.      i
9cf0: 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b  Lower = aSample[
9d00: 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  iSamp].anLt[n-1]
9d10: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69  ;.      iMin = i
9d20: 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 72 65  Test+1;.      re
9d30: 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  s = -1;.    }els
9d40: 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70 6c 65  e{.      iSample
9d50: 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20 20 20   = iTest;.      
9d60: 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20  iCol = n-1;.    
9d70: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
9d80: 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20  && iMin<iSample 
9d90: 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70 6c 65  );.  i = iSample
9da0: 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64   / nField;..#ifd
9db0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9dc0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
9dd0: 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
9de0: 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61 74 20  ents check that 
9df0: 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63  the binary searc
9e00: 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76  h code.  ** abov
9e10: 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69 67 68  e found the righ
9e20: 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73 20 62  t answer. This b
9e30: 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f 20 70  lock serves no p
9e40: 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a  urpose other.  *
9e50: 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65  * than to invoke
9e60: 20 74 68 65 20 61 73 73 65 72 74 73 2e 20 20 2a   the asserts.  *
9e70: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
9e80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==0 ){.    if( r
9ea0: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
9eb0: 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20 69 73  * If (res==0) is
9ec0: 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52 65 63   true, then pRec
9ed0: 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c 20 74   must be equal t
9ee0: 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20  o sample i. */. 
9ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
9f00: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
9f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
9f20: 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a  ol==nField-1 );.
9f30: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
9f40: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ld = nField;.   
9f50: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
9f60: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
9f70: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
9f80: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
9f90: 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20 20 20  p, pRec) .      
9fa0: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
9fb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9fc0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d   .      );.    }
9fd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
9fe0: 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e  nless i==pIdx->n
9ff0: 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61 74 69  Sample, indicati
a000: 6e 67 20 74 68 61 74 20 70 52 65 63 20 69 73 20  ng that pRec is 
a010: 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20 20 20  larger than.    
a020: 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73    ** all samples
a030: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
a040: 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20 6d 75  ] array, pRec mu
a050: 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  st be smaller th
a060: 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  an the.      ** 
a070: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
a080: 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20  refix of sample 
a090: 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  i.  */.      ass
a0a0: 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53  ert( i<=pIdx->nS
a0b0: 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b  ample && i>=0 );
a0c0: 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  .      pRec->nFi
a0d0: 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  eld = iCol+1;.  
a0e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
a0f0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  Idx->nSample .  
a100: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
a110: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
a120: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
a130: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
a140: 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
a150: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
a160: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a170: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  );..      /* if 
a180: 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30  i==0 and iCol==0
a190: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 70 52  , then record pR
a1a0: 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ec is smaller th
a1b0: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20  an all samples. 
a1c0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 61       ** in the a
a1d0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20  Sample[] array. 
a1e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 28 69  Otherwise, if (i
a1f0: 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52 65 63  Col>0) then pRec
a200: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
a210: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
a220: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 28  r equal to the (
a230: 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72 65 66  iCol) field pref
a240: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a  ix of sample i..
a250: 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69 3e 30        ** If (i>0
a260: 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  ), then pRec mus
a270: 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61 74 65  t also be greate
a280: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 28 69  r than sample (i
a290: 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  -1).  */.      i
a2a0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
a2b0: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
a2c0: 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  d = iCol;.      
a2d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a2e0: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
a2f0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
a300: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
a310: 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20 20 20  Rec)<=0.        
a320: 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
a330: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a340: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
a350: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
a360: 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
a370: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  d = nField;.    
a380: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a390: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
a3a0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31  pare(aSample[i-1
a3b0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31  ].n, aSample[i-1
a3c0: 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20 20 20  ].p, pRec)<0.   
a3d0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
a3e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
a3f0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
a400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
a410: 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
a420: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66  E_DEBUG */..  if
a430: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
a440: 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63 20 69  /* Record pRec i
a450: 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  s equal to sampl
a460: 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e i */.    asser
a470: 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
a480: 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  1 );.    aStat[0
a490: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
a4a0: 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61  nLt[iCol];.    a
a4b0: 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c  Stat[1] = aSampl
a4c0: 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b  e[i].anEq[iCol];
a4d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
a4e0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
a4f0: 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66 69 65  the (iCol+1) fie
a500: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61 53 61  ld prefix of aSa
a510: 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
a520: 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d  irst .    ** sam
a530: 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
a540: 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e 20 4f  ter than pRec. O
a550: 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e  r, if i==pIdx->n
a560: 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52 65 63  Sample then pRec
a570: 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72 67 65  .    ** is large
a580: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
a590: 65 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  es in the array.
a5a0: 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
a5b0: 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
a5c0: 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e    if( i>=pIdx->n
a5d0: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
a5e0: 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74 65 33  iUpper = sqlite3
a5f0: 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78  LogEstToInt(pIdx
a600: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
a610: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a620: 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61      iUpper = aSa
a630: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
a640: 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l];.    }..    i
a650: 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
a660: 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20  r ){.      iGap 
a670: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
a680: 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70        iGap = iUp
a690: 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
a6a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e    }.    if( roun
a6b0: 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61  dUp ){.      iGa
a6c0: 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a  p = (iGap*2)/3;.
a6d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a6e0: 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a   iGap = iGap/3;.
a6f0: 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
a700: 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47  0] = iLower + iG
a710: 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  ap;.    aStat[1]
a720: 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45 71 5b   = pIdx->aAvgEq[
a730: 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iCol];.  }..  /*
a740: 20 52 65 73 74 6f 72 65 20 74 68 65 20 70 52 65   Restore the pRe
a750: 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20  c->nField value 
a760: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
a770: 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46  .  */.  pRec->nF
a780: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
a790: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e   return i;.}.#en
a7a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
a7b0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a7c0: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT4 */../*.** If
a7d0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
a7e0: 20 70 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d   pTerm is a term
a7f0: 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 61   that provides a
a800: 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  n upper or lower
a810: 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72  .** bound on a r
a820: 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f  ange scan. Witho
a830: 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70  ut considering p
a840: 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69  Term, it is esti
a850: 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74  mated .** that t
a860: 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  he scan will vis
a870: 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68  it nNew rows. Th
a880: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
a890: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  rns the number.*
a8a0: 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62  * estimated to b
a8b0: 65 20 76 69 73 69 74 65 64 20 61 66 74 65 72 20  e visited after 
a8c0: 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74  taking pTerm int
a8d0: 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a  o account..**.**
a8e0: 20 49 66 20 74 68 65 20 75 73 65 72 20 65 78 70   If the user exp
a8f0: 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
a900: 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  d a likelihood()
a910: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
a920: 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  term,.** then th
a930: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
a940: 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64  s the likelihood
a950: 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74   multiplied by t
a960: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
a970: 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65  input rows. Othe
a980: 72 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63  rwise, this func
a990: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
a9a0: 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c  t an "IS NOT NUL
a9b0: 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61  L" term.** has a
a9c0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30   likelihood of 0
a9d0: 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68  .50, and any oth
a9e0: 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69  er term a likeli
a9f0: 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f  hood of 0.25..*/
aa00: 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
aa10: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
aa20: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
aa30: 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a  , LogEst nNew){.
aa40: 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20    LogEst nRet = 
aa50: 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72  nNew;.  if( pTer
aa60: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  m ){.    if( pTe
aa70: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
aa80: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b   ){.      nRet +
aa90: 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
aaa0: 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ob;.    }else if
aab0: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
aac0: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
aad0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
aae0: 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61   -= 20;        a
aaf0: 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74  ssert( 20==sqlit
ab00: 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20  e3LogEst(4) );. 
ab10: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ab20: 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64  n nRet;.}...#ifd
ab30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ab40: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
ab50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ab60: 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20   affinity for a 
ab70: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
ab80: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68   an index..*/.ch
ab90: 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43  ar sqlite3IndexC
aba0: 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71  olumnAffinity(sq
abb0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
abc0: 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c   *pIdx, int iCol
abd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  ){.  assert( iCo
abe0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64  l>=0 && iCol<pId
abf0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
ac00: 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41  if( !pIdx->zColA
ac10: 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ff ){.    if( sq
ac20: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
ac30: 74 79 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d  tyStr(db, pIdx)=
ac40: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
ac50: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
ac60: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e  .  return pIdx->
ac70: 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d  zColAff[iCol];.}
ac80: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
ac90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
aca0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
acb0: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
acc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
acd0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
ace0: 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ber of rows visi
acf0: 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67  ted by a.** rang
ad00: 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70  e-scan on a skip
ad10: 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72  -scan index. For
ad20: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
ad30: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
ad40: 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29  1 ON t1(a, b, c)
ad50: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  ;.**   SELECT * 
ad60: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
ad70: 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20  ? AND c BETWEEN 
ad80: 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56  ? AND ?;.**.** V
ad90: 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  alue pLoop->nOut
ada0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
adb0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
adc0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
add0: 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f  s .** visited fo
ade0: 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20  r scanning (a=? 
adf0: 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66  AND b=?). This f
ae00: 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20  unction reduces 
ae10: 74 68 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a  that estimate .*
ae20: 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72  * by some factor
ae30: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
ae40: 74 68 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f  the (c BETWEEN ?
ae50: 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69   AND ?) expressi
ae60: 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74  on based.** on t
ae70: 68 65 20 73 74 61 74 34 20 64 61 74 61 20 66 6f  he stat4 data fo
ae80: 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69  r the index. thi
ae90: 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70  s scan will be p
aea0: 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65  eformed multiple
aeb0: 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65   .** times (once
aec0: 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20   for each (a,b) 
aed0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74  combination that
aee0: 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73   matches a=?) is
aef0: 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20   dealt with .** 
af00: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
af10: 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69  *.** It does thi
af20: 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68  s by scanning th
af30: 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20  rough all stat4 
af40: 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69  samples, compari
af50: 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74  ng values.** ext
af60: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
af70: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 77 69  er and pUpper wi
af80: 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  th the correspon
af90: 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  ding column in e
afa0: 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49  ach.** sample. I
afb0: 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68  f L and U are th
afc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  e number of samp
afd0: 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  les found to be 
afe0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20  less than or.** 
aff0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c  equal to the val
b000: 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  ues extracted fr
b010: 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  om pLower and pU
b020: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
b030: 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74  y, and.** N is t
b040: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
b050: 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20  of samples, the 
b060: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75  pLoop->nOut valu
b070: 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  e is adjusted.**
b080: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
b090: 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74  **   nOut = nOut
b0a0: 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20   * ( min(U - L, 
b0b0: 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49  1) / N ).**.** I
b0c0: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
b0d0: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
b0e0: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
b0f0: 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20   from the term, 
b100: 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a  L is.** set to z
b110: 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69  ero. If pUpper i
b120: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
b130: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
b140: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a  racted from it,.
b150: 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e  ** U is set to N
b160: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
b170: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
b180: 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20  sets *pbDone to 
b190: 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  1 before returni
b1a0: 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
b1b0: 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20  if no value can 
b1c0: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
b1d0: 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20  m either pLower 
b1e0: 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64 20 73  or pUpper (and s
b1f0: 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74  o the.** estimat
b200: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
b210: 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65  of rows delivere
b220: 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  d remains unchan
b230: 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a  ged), *pbDone.**
b240: 20 69 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a   is left as is..
b250: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
b260: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
b270: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
b280: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
b290: 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54  rwise, .** SQLIT
b2a0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
b2b0: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b  int whereRangeSk
b2c0: 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  ipScanEst(.  Par
b2d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b2e0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
b2f0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
b300: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
b310: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
b320: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
b330: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
b340: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
b350: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
b360: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
b370: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
b380: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
b390: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
b3a0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
b3b0: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
b3c0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
b3d0: 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20   .nOut value of 
b3e0: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
b3f0: 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20  nt *pbDone      
b400: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
b410: 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f  ue if at least o
b420: 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65  ne expr. value e
b430: 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20  xtracted */.){. 
b440: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
b450: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
b460: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
b470: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
b480: 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  q;.  sqlite3 *db
b490: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b4a0: 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31   int nLower = -1
b4b0: 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d  ;.  int nUpper =
b4c0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20   p->nSample+1;. 
b4d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b4e0: 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20  _OK;.  u8 aff = 
b4f0: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
b500: 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70  mnAffinity(db, p
b510: 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65  , nEq);.  CollSe
b520: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
b530: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
b540: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
b550: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
b560: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
b570: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b580: 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
b590: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
b5a0: 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
b5b0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
b5c0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
b5d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
b5e0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
b5f0: 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
b600: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
b610: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
b620: 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
b630: 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
b640: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b650: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
b660: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
b670: 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
b680: 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
b690: 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
b6a0: 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
b6b0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
b6c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b6d0: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
b6e0: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
b6f0: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
b700: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
b710: 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
b720: 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
b730: 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
b740: 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
b750: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
b760: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
b770: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b780: 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
b790: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
b7a0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
b7b0: 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
b7c0: 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
b7d0: 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
b7e0: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
b7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b800: 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
b810: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
b820: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
b830: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
b840: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
b850: 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
b860: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
b870: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b880: 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
b890: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
b8a0: 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
b8b0: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
b8c0: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
b8d0: 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
b8e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
b8f0: 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
b900: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
b910: 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
b920: 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
b930: 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
b940: 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
b950: 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
b960: 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
b970: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
b980: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
b990: 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
b9a0: 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
b9b0: 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
b9c0: 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
b9d0: 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
b9e0: 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
b9f0: 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
ba00: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
ba10: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
ba20: 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
ba30: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
ba40: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
ba50: 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
ba60: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
ba70: 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
ba80: 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
ba90: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
baa0: 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
bab0: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
bac0: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
bad0: 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
bae0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
baf0: 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
bb00: 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
bb10: 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
bb20: 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
bb30: 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
bb40: 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
bb50: 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
bb60: 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
bb70: 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
bb80: 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
bb90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
bbb0: 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
bbc0: 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
bbd0: 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
bbe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
bbf0: 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
bc00: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
bc10: 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
bc20: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
bc30: 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
bc40: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
bc50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bc60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bc70: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
bc80: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
bc90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
bca0: 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
bcb0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
bcc0: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
bcd0: 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
bce0: 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
bcf0: 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
bd00: 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
bd10: 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
bd20: 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
bd30: 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
bd40: 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
bd50: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
bd60: 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
bd70: 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
bd80: 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
bd90: 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
bda0: 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
bdb0: 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
bdc0: 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
bdd0: 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
bde0: 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
bdf0: 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
be00: 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
be10: 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
be40: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
be50: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
be60: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
be80: 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
be90: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
bea0: 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
beb0: 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
bec0: 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
bed0: 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
bee0: 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
bef0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
bf00: 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
bf10: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
bf20: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
bf30: 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
bf40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
bf50: 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
bf60: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
bf70: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
bf80: 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
bf90: 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
bfa0: 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
bfb0: 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
bfc0: 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
bfd0: 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
bfe0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
bff0: 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
c000: 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
c010: 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
c020: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
c030: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
c040: 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
c050: 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
c060: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
c070: 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
c080: 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
c090: 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
c0a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
c0b0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
c0c0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
c0d0: 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
c0e0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
c0f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
c100: 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
c110: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
c120: 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
c130: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
c140: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
c150: 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
c160: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
c170: 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
c180: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
c190: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
c1a0: 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
c1b0: 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
c1c0: 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
c1d0: 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
c1e0: 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
c1f0: 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75  is 0, then *pnOu
c200: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
c210: 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74  of .** rows in t
c220: 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69  he index. Assumi
c230: 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ng no error occu
c240: 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64  rs, *pnOut is ad
c250: 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29  justed (reduced)
c260: 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  .** to account f
c270: 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  or the range con
c280: 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20  straints pLower 
c290: 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a  and pUpper..** .
c2a0: 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
c2b0: 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
c2c0: 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  4 ANALYZE data, 
c2d0: 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20  or if such data 
c2e0: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
c2f0: 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67  d, a single rang
c300: 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
c310: 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
c320: 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
c330: 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20  r of 4. .** and 
c340: 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72  a pair of constr
c350: 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78  aints (x>? AND x
c360: 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20  <?) reduces the 
c370: 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
c380: 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74  of.** rows visit
c390: 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ed by a factor o
c3a0: 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 64..*/.static 
c3b0: 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
c3c0: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
c3d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
c3e0: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
c3f0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
c400: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
c410: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
c420: 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20  er,.  WhereTerm 
c430: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
c440: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
c450: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
c460: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
c470: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
c480: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
c490: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
c4a0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
c4b0: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
c4c0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
c4d0: 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20  p *pLoop     /* 
c4e0: 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74  Modify the .nOut
c4f0: 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e   and maybe .rRun
c500: 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
c510: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c520: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d  OK;.  int nOut =
c530: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20   pLoop->nOut;.  
c540: 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69  LogEst nNew;..#i
c550: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c560: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
c570: 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  4.  Index *p = p
c580: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
c590: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
c5a0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
c5b0: 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  .nEq;..  if( p->
c5c0: 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71  nSample>0 && nEq
c5d0: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29  <p->nSampleCol )
c5e0: 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70  {.    if( nEq==p
c5f0: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
c600: 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61  id ){.      Unpa
c610: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
c620: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
c630: 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  c;.      tRowcnt
c640: 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74   a[2];.      int
c650: 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nBtm = pLoop->u
c660: 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20  .btree.nBtm;.   
c670: 20 20 20 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c     int nTop = pL
c680: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  oop->u.btree.nTo
c690: 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72  p;..      /* Var
c6a0: 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c  iable iLower wil
c6b0: 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  l be set to the 
c6c0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
c6d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
c6e0: 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  n .      ** the 
c6f0: 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c  index that are l
c700: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
c710: 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
c720: 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65  range query. The
c730: 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20  .      ** lower 
c740: 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20  bound being the 
c750: 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
c760: 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72   $P and $L, wher
c770: 65 20 24 50 20 69 73 20 74 68 65 0a 20 20 20 20  e $P is the.    
c780: 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
c790: 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
c7a0: 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
c7b0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
c7c0: 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20   left-most.     
c7d0: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74   ** columns of t
c7e0: 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c  he index, and $L
c7f0: 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e   is the value in
c800: 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a   pLower..      *
c810: 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69  *.      ** Or, i
c820: 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c  f pLower is NULL
c830: 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65   or $L cannot be
c840: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c850: 69 74 20 28 62 65 63 61 75 73 65 20 69 74 0a 20  it (because it. 
c860: 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
c870: 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65   simple variable
c880: 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75   or literal valu
c890: 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  e), the lower bo
c8a0: 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20  und of the.     
c8b0: 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e   ** range is $P.
c8c0: 20 44 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20   Due to a quirk 
c8d0: 69 6e 20 74 68 65 20 77 61 79 20 77 68 65 72 65  in the way where
c8e0: 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73  KeyStats() works
c8f0: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , even.      ** 
c900: 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62  if $L is availab
c910: 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74  le, whereKeyStat
c920: 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  s() is called fo
c930: 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20  r both ($P) and 
c940: 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c  .      ** ($P:$L
c950: 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72  ) and the larger
c960: 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 74 75   of the two retu
c970: 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73 20 75  rned values is u
c980: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sed..      **.  
c990: 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79      ** Similarly
c9a0: 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f 20 62  , iUpper is to b
c9b0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c9c0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c9d0: 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20  ber of rows.    
c9e0: 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74    ** less than t
c9f0: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f  he upper bound o
ca00: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
ca10: 79 2e 20 57 68 65 72 65 20 74 68 65 20 75 70 70  y. Where the upp
ca20: 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a  er bound.      *
ca30: 2a 20 69 73 20 65 69 74 68 65 72 20 28 24 50 29  * is either ($P)
ca40: 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61   or ($P:$U). Aga
ca50: 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69  in, even if $U i
ca60: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74  s available, bot
ca70: 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  h values.      *
ca80: 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72 65 20  * of iUpper are 
ca90: 72 65 71 75 65 73 74 65 64 20 6f 66 20 77 68 65  requested of whe
caa0: 72 65 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64  reKeyStats() and
cab0: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65   the smaller use
cac0: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
cad0: 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    ** The number 
cae0: 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20  of rows between 
caf0: 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69  the two bounds i
cb00: 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70  s then just iUpp
cb10: 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20  er-iLower..     
cb20: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
cb30: 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a  t iLower;     /*
cb40: 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   Rows less than 
cb50: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
cb60: 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  */.      tRowcnt
cb70: 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20   iUpper;     /* 
cb80: 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74  Rows less than t
cb90: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a  he upper bound *
cba0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72  /.      int iLwr
cbb0: 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61  Idx = -2;   /* a
cbc0: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65  Sample[] for the
cbd0: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
cbe0: 20 20 20 20 20 20 69 6e 74 20 69 55 70 72 49 64        int iUprId
cbf0: 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61  x = -1;   /* aSa
cc00: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75  mple[] for the u
cc10: 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20  pper bound */.. 
cc20: 20 20 20 20 20 69 66 28 20 70 52 65 63 20 29 7b       if( pRec ){
cc30: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
cc40: 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21  e( pRec->nField!
cc50: 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
cc60: 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  alid );.        
cc70: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  pRec->nField = p
cc80: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
cc90: 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  id;.      }.    
cca0: 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69    /* Determine i
ccb0: 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72  Lower and iUpper
ccc0: 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79   using ($P) only
ccd0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  . */.      if( n
cce0: 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Eq==0 ){.       
ccf0: 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
cd00: 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d       iUpper = p-
cd10: 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20  >nRowEst0;.     
cd20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cd30: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
cd40: 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69  ll could be opti
cd50: 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e  mized away - sin
cd60: 63 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ce the same valu
cd70: 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20  es must .       
cd80: 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65   ** have been re
cd90: 71 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73  quested when tes
cda0: 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77  ting key $P in w
cdb0: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
cdc0: 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ().  */.        
cdd0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
cde0: 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
cdf0: 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c  , a);.        iL
ce00: 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  ower = a[0];.   
ce10: 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
ce20: 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20  0] + a[1];.     
ce30: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
ce40: 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28  ( pLower==0 || (
ce50: 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
ce60: 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
ce70: 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))!=0 );.      a
ce80: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
ce90: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70   || (pUpper->eOp
cea0: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
ceb0: 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
cec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
ced0: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
cee0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f        if( p->aSo
cef0: 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a  rtOrder[nEq] ){.
cf00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
cf10: 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61  oles of pLower a
cf20: 6e 64 20 70 55 70 70 65 72 20 61 72 65 20 73 77  nd pUpper are sw
cf30: 61 70 70 65 64 20 66 6f 72 20 61 20 44 45 53 43  apped for a DESC
cf40: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
cf50: 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
cf60: 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65  *, pLower, pUppe
cf70: 72 29 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50  r);.        SWAP
cf80: 28 69 6e 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70  (int, nBtm, nTop
cf90: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
cfa0: 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
cfb0: 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
cfc0: 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65   iLower estimate
cfd0: 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20   using ($P:$L). 
cfe0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  */.      if( pLo
cff0: 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  wer ){.        i
d000: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
d010: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
d020: 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
d030: 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
d040: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
d050: 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e   pLower->pExpr->
d060: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
d070: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
d080: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
d090: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
d0a0: 20 70 45 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45   pExpr, nBtm, nE
d0b0: 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  q, &n);.        
d0c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d0d0: 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20  K && n ){.      
d0e0: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
d0f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20  ;.          u16 
d100: 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  mask = WO_GT|WO_
d110: 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  LE;.          if
d120: 28 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  ( sqlite3ExprVec
d130: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e  torSize(pExpr)>n
d140: 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45   ) mask = (WO_LE
d150: 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20  |WO_LT);.       
d160: 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65     iLwrIdx = whe
d170: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
d180: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
d190: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
d1a0: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f  w = a[0] + ((pLo
d1b0: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
d1c0: 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20   mask) ? a[1] : 
d1d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
d1e0: 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20  ( iNew>iLower ) 
d1f0: 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iLower = iNew;. 
d200: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
d210: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65  .          pLowe
d220: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
d230: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d240: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
d250: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
d260: 55 70 70 65 72 20 65 73 74 69 6d 61 74 65 20 75  Upper estimate u
d270: 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f  sing ($P:$U). */
d280: 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65  .      if( pUppe
d290: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
d2a0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
d2b0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73         /* Values
d2c0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
d2d0: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
d2e0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
d2f0: 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
d300: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
d310: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
d320: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
d330: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
d340: 45 78 70 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c  Expr, nTop, nEq,
d350: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66   &n);.        if
d360: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d370: 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  && n ){.        
d380: 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
d390: 20 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61            u16 ma
d3a0: 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45  sk = WO_GT|WO_LE
d3b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d3c0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d3d0: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29  rSize(pExpr)>n )
d3e0: 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57   mask = (WO_LE|W
d3f0: 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20  O_LT);.         
d400: 20 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65   iUprIdx = where
d410: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
d420: 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b   p, pRec, 1, a);
d430: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
d440: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
d450: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d  r->eOperator & m
d460: 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  ask) ? a[1] : 0)
d470: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d480: 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55  iNew<iUpper ) iU
d490: 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  pper = iNew;.   
d4a0: 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20         nOut--;. 
d4b0: 20 20 20 20 20 20 20 20 20 70 55 70 70 65 72 20           pUpper 
d4c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
d4d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42       }..      pB
d4e0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70  uilder->pRec = p
d4f0: 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Rec;.      if( r
d500: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d510: 20 20 20 20 20 20 20 20 69 66 28 20 69 55 70 70          if( iUpp
d520: 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20  er>iLower ){.   
d530: 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71         nNew = sq
d540: 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70  lite3LogEst(iUpp
d550: 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20  er - iLower);.  
d560: 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
d570: 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55 70 70  G:  If both iUpp
d580: 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20 61 72  er and iLower ar
d590: 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  e derived from t
d5a0: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20  he same.        
d5b0: 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65    ** sample, the
d5c0: 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20 61 72  n assume they ar
d5d0: 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65 63 74  e 4x more select
d5e0: 69 76 65 2e 20 20 54 68 69 73 20 62 72 69 6e 67  ive.  This bring
d5f0: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
d600: 68 65 20 65 73 74 69 6d 61 74 65 64 20 73 65 6c  he estimated sel
d610: 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20 69 6e  ectivity more in
d620: 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61 74 20   line with what 
d630: 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 20 20  it would be.    
d640: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73 74 69        ** if esti
d650: 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20 74 68  mated without th
d660: 65 20 75 73 65 20 6f 66 20 53 54 41 54 33 2f 34  e use of STAT3/4
d670: 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20   tables. */.    
d680: 20 20 20 20 20 20 69 66 28 20 69 4c 77 72 49 64        if( iLwrId
d690: 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e 4e 65  x==iUprIdx ) nNe
d6a0: 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65 72 74  w -= 20;  assert
d6b0: 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 20==sqlite3Log
d6c0: 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 20 20  Est(4) );.      
d6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d6e0: 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20     nNew = 10;   
d6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d       assert( 10=
d700: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
d710: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ) );.        }. 
d720: 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c         if( nNew<
d730: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
d740: 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20    nOut = nNew;. 
d750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d760: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
d770: 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67 65 20  , ("STAT4 range 
d780: 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73  scan: %u..%u  es
d790: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c      (u32)iLower,
d7c0: 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f   (u32)iUpper, nO
d7d0: 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ut));.      }.  
d7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
d7f0: 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  nt bDone = 0;.  
d800: 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61      rc = whereRa
d810: 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70  ngeSkipScanEst(p
d820: 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70  Parse, pLower, p
d830: 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62  Upper, pLoop, &b
d840: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Done);.      if(
d850: 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20   bDone ) return 
d860: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
d870: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
d880: 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a  AMETER(pParse);.
d890: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d8a0: 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20  ER(pBuilder);.  
d8b0: 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c  assert( pLower |
d8c0: 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e 64  | pUpper );.#end
d8d0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 55 70  if.  assert( pUp
d8e0: 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65  per==0 || (pUppe
d8f0: 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
d900: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
d910: 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e   nNew = whereRan
d920: 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c  geAdjust(pLower,
d930: 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d   nOut);.  nNew =
d940: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
d950: 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b  t(pUpper, nNew);
d960: 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49  ..  /* TUNING: I
d970: 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
d980: 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  an upper and low
d990: 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69  er limit and nei
d9a0: 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20  ther limit.  ** 
d9b0: 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69  has an applicati
d9c0: 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c  on-defined likel
d9d0: 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65 20  ihood(), assume 
d9e0: 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20 2a  the range is.  *
d9f0: 2a 20 72 65 64 75 63 65 64 20 62 79 20 61 6e 20  * reduced by an 
da00: 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20  additional 75%. 
da10: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 2c  This means that,
da20: 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e 20   by default, an 
da30: 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20  open-ended.  ** 
da40: 72 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e 67  range query (e.g
da50: 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73  . col > ?) is as
da60: 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20 31  sumed to match 1
da70: 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69  /4 of the rows i
da80: 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
da90: 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65 64  . While a closed
daa0: 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c   range (e.g. col
dab0: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
dac0: 29 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 74  ) is estimated t
dad0: 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36  o.  ** match 1/6
dae0: 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  4 of the index. 
daf0: 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  */ .  if( pLower
db00: 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74   && pLower->trut
db10: 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70 70 65  hProb>0 && pUppe
db20: 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74 72 75  r && pUpper->tru
db30: 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20  thProb>0 ){.    
db40: 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a  nNew -= 20;.  }.
db50: 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77  .  nOut -= (pLow
db60: 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72  er!=0) + (pUpper
db70: 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77  !=0);.  if( nNew
db80: 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b  <10 ) nNew = 10;
db90: 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74  .  if( nNew<nOut
dba0: 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a   ) nOut = nNew;.
dbb0: 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52  #if defined(WHER
dbc0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a  ETRACE_ENABLED).
dbd0: 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
dbe0: 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48  t>nOut ){.    WH
dbf0: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
dc00: 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72  Range scan lower
dc10: 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74  s nOut from %d t
dc20: 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %d\n",.       
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
dc40: 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29  op->nOut, nOut))
dc50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
dc60: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
dc70: 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74  gEst)nOut;.  ret
dc80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
dc90: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
dca0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
dcb0: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
dcc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
dcd0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
dce0: 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
dcf0: 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
dd00: 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
dd10: 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
dd20: 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
dd30: 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
dd40: 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
dd50: 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
dd60: 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
dd70: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
dd80: 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
dd90: 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61  e_stat3 histogra
dda0: 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
ddb0: 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
ddc0: 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
ddd0: 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
dde0: 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
ddf0: 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
de00: 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
de10: 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
de20: 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
de30: 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
de40: 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
de50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
de60: 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
de70: 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
de80: 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
de90: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
dea0: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
deb0: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
dec0: 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
ded0: 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
dee0: 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
def0: 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
df00: 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
df10: 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
df20: 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
df30: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
df40: 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
df50: 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
df60: 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
df70: 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
df80: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
df90: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
dfa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
dfb0: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
dfc0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
dfd0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
dfe0: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
dff0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
e000: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
e010: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
e020: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
e030: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
e040: 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
e050: 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
e060: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
e070: 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
e080: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
e090: 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
e0a0: 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
e0b0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
e0c0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
e0d0: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
e0e0: 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72  t nEq = pBuilder
e0f0: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
e100: 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  nEq;.  UnpackedR
e110: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
e120: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
e130: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
e140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
e150: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
e160: 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  code */.  tRowcn
e170: 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  t a[2];         
e180: 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63      /* Statistic
e190: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a  s */.  int bOk;.
e1a0: 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d  .  assert( nEq>=
e1b0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  1 );.  assert( n
e1c0: 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Eq<=p->nColumn )
e1d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
e1e0: 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61  Sample!=0 );.  a
e1f0: 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c  ssert( p->nSampl
e200: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
e210: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e220: 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f  alid<nEq );..  /
e230: 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72 65 20  * If values are 
e240: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
e250: 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  r all fields of 
e260: 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65  the index to the
e270: 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68   left.  ** of th
e280: 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d  is one, no estim
e290: 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e  ate can be made.
e2a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   Return SQLITE_N
e2b0: 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66  OTFOUND. */.  if
e2c0: 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
e2d0: 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b  Valid<(nEq-1) ){
e2e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e2f0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d  TE_NOTFOUND;.  }
e300: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ..  /* This is a
e310: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  n optimization o
e320: 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f  nly. The call to
e330: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
e340: 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a  beSetValue().  *
e350: 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65  * below would re
e360: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61  turn the same va
e370: 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e  lue.  */.  if( n
e380: 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Eq>=p->nColumn )
e390: 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31  {.    *pnRow = 1
e3a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e3b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
e3c0: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
e3d0: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
e3e0: 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
e3f0: 70 45 78 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c  pExpr, 1, nEq-1,
e400: 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64   &bOk);.  pBuild
e410: 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
e420: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e430: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
e440: 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29  ;.  if( bOk==0 )
e450: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e460: 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c  OTFOUND;.  pBuil
e470: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
e480: 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65   nEq;..  whereKe
e490: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
e4a0: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
e4b0: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
e4c0: 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e  ,("equality scan
e4d0: 20 72 65 67 69 6f 6e 73 20 25 73 28 25 64 29 3a   regions %s(%d):
e4e0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
e4f0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
e500: 61 6d 65 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74  ame, nEq-1, (int
e510: 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f  )a[1]));.  *pnRo
e520: 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72  w = a[1];.  .  r
e530: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
e540: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
e550: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
e560: 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  T4 */..#ifdef SQ
e570: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
e580: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
e590: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
e5a0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
e5b0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
e5c0: 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
e5d0: 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
e5e0: 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
e5f0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
e600: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
e610: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c  is a list of val
e620: 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ues.  Example:.*
e630: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52  *.**        WHER
e640: 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29  E x IN (1,2,3,4)
e650: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
e660: 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
e670: 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
e680: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
e690: 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
e6a0: 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
e6b0: 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
e6c0: 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
e6d0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
e6e0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
e6f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
e700: 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
e710: 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
e720: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e730: 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
e740: 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
e750: 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
e760: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
e770: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
e780: 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
e790: 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
e7a0: 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
e7b0: 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
e7c0: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
e7d0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
e7e0: 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e   int whereInScan
e7f0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
e800: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
e810: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
e820: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
e830: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
e840: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
e850: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ,.  ExprList *pL
e860: 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
e870: 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
e880: 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
e890: 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
e8a0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
e8b0: 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
e8c0: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
e8d0: 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
e8e0: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
e8f0: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
e900: 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
e910: 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d  x;.  i64 nRow0 =
e920: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
e930: 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45  Int(p->aiRowLogE
e940: 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52  st[0]);.  int nR
e950: 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
e960: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
e970: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e980: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66  _OK;     /* Subf
e990: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
e9a0: 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
e9b0: 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20   nEst;          
e9c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f   /* Number of ro
e9d0: 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ws for a single 
e9e0: 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  term */.  tRowcn
e9f0: 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20  t nRowEst = 0;  
ea00: 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74    /* New estimat
ea10: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
ea20: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
ea30: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ea40: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
ea50: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
ea60: 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
ea70: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   );.  for(i=0; r
ea80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ea90: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
eaa0: 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d  i++){.    nEst =
eab0: 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d   nRow0;.    rc =
eac0: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
ead0: 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
eae0: 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  der, pList->a[i]
eaf0: 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a  .pExpr, &nEst);.
eb00: 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e      nRowEst += n
eb10: 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  Est;.    pBuilde
eb20: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
eb30: 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20  RecValid;.  }.. 
eb40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
eb50: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
eb60: 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20  owEst > nRow0 ) 
eb70: 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b  nRowEst = nRow0;
eb80: 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  .    *pnRow = nR
eb90: 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45  owEst;.    WHERE
eba0: 54 52 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20  TRACE(0x10,("IN 
ebb0: 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73  row estimate: es
ebc0: 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74  t=%d\n", nRowEst
ebd0: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
ebe0: 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
ebf0: 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64  Valid==nRecValid
ec00: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
ec10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ec20: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
ec30: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23  _OR_STAT4 */...#
ec40: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
ec50: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
ec60: 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  rint the content
ec70: 20 6f 66 20 61 20 57 68 65 72 65 54 65 72 6d 20   of a WhereTerm 
ec80: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
ec90: 20 76 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50   void whereTermP
eca0: 72 69 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a  rint(WhereTerm *
ecb0: 70 54 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d  pTerm, int iTerm
ecc0: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  ){.  if( pTerm==
ecd0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
ece0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 54 45 52  DebugPrintf("TER
ecf0: 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20  M-%-3d NULL\n", 
ed00: 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  iTerm);.  }else{
ed10: 0a 20 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b  .    char zType[
ed20: 34 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 4c 65  4];.    char zLe
ed30: 66 74 5b 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63  ft[50];.    memc
ed40: 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
ed50: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   4);.    if( pTe
ed60: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
ed70: 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79  RM_VIRTUAL ) zTy
ed80: 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20  pe[0] = 'V';.   
ed90: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
eda0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
edb0: 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27    ) zType[1] = '
edc0: 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  E';.    if( Expr
edd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
ede0: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
edf0: 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32  mJoin) ) zType[2
ee00: 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 69 66 28  ] = 'L';.    if(
ee10: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
ee20: 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b  r & WO_SINGLE ){
ee30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
ee40: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
ee50: 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66  Left),zLeft,"lef
ee60: 74 3d 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20  t={%d:%d}",.    
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75     pTerm->leftCu
ee90: 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  rsor, pTerm->u.l
eea0: 65 66 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  eftColumn);.    
eeb0: 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
eec0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
eed0: 5f 4f 52 29 21 3d 30 20 26 26 20 70 54 65 72 6d  _OR)!=0 && pTerm
eee0: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29  ->u.pOrInfo!=0 )
eef0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ef00: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
ef10: 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e  zLeft),zLeft,"in
ef20: 64 65 78 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c  dexable=0x%lld",
ef30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ef40: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
ef50: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
ef60: 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  able);.    }else
ef70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ef80: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
ef90: 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65  zLeft),zLeft,"le
efa0: 66 74 3d 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c  ft=%d", pTerm->l
efb0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
efc0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
efd0: 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
efe0: 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25   "TERM-%-3d %p %
eff0: 73 20 25 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33  s %-12s prob=%-3
f000: 64 20 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c  d op=0x%03x wtFl
f010: 61 67 73 3d 30 78 25 30 34 78 22 2c 0a 20 20 20  ags=0x%04x",.   
f020: 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d      iTerm, pTerm
f030: 2c 20 7a 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20  , zType, zLeft, 
f040: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
f050: 2c 0a 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ,.       pTerm->
f060: 65 4f 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d  eOperator, pTerm
f070: 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  ->wtFlags);.    
f080: 69 66 28 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c  if( pTerm->iFiel
f090: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
f0a0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f0b0: 69 46 69 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54  iField=%d\n", pT
f0c0: 65 72 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20  erm->iField);.  
f0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
f0e0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f0f0: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  f("\n");.    }. 
f100: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
f110: 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d  ewExpr(0, pTerm-
f120: 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a  >pExpr, 0);.  }.
f130: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
f140: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
f150: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74  LED./*.** Show t
f160: 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
f170: 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 43 6c  ent of a WhereCl
f180: 61 75 73 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ause.*/.void sql
f190: 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50  ite3WhereClauseP
f1a0: 72 69 6e 74 28 57 68 65 72 65 43 6c 61 75 73 65  rint(WhereClause
f1b0: 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b   *pWC){.  int i;
f1c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
f1d0: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  C->nTerm; i++){.
f1e0: 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
f1f0: 6e 74 28 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69  nt(&pWC->a[i], i
f200: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
f210: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
f220: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
f230: 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
f240: 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
f250: 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
f260: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f270: 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
f280: 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65  hereLoop *p, Whe
f290: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
f2a0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
f2b0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
f2c0: 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b  o;.  int nb = 1+
f2d0: 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  (pWInfo->pTabLis
f2e0: 74 2d 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20  t->nSrc+3)/4;.  
f2f0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
f300: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49  tem *pItem = pWI
f310: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
f320: 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61   + p->iTab;.  Ta
f330: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
f340: 6d 2d 3e 70 54 61 62 3b 0a 20 20 42 69 74 6d 61  m->pTab;.  Bitma
f350: 73 6b 20 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74  sk mAll = (((Bit
f360: 6d 61 73 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29  mask)1)<<(nb*4))
f370: 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 44   - 1;.  sqlite3D
f380: 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 25 32  ebugPrintf("%c%2
f390: 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22  d.%0*llx.%0*llx"
f3a0: 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20  , p->cId,.      
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f3c0: 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d  ->iTab, nb, p->m
f3d0: 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e  askSelf, nb, p->
f3e0: 70 72 65 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a  prereq & mAll);.
f3f0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f400: 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
f430: 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
f440: 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
f450: 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
f460: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
f470: 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
f480: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f490: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  Name;.    if( p-
f4a0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
f4b0: 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75  && (zName = p->u
f4c0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
f4d0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
f4e0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
f4f0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
f500: 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30  oindex_", 17)==0
f510: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f520: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
f530: 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a  n30(zName) - 1;.
f540: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
f550: 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69  Name[i]!='_' ) i
f560: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  --;.        zNam
f570: 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  e += i;.      }.
f580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
f590: 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73  ugPrintf(".%-16s
f5a0: 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d   %2d", zName, p-
f5b0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20  >u.btree.nEq);. 
f5c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f5d0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f5e0: 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20  tf("%20s","");. 
f5f0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
f600: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
f610: 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  f( p->u.vtab.idx
f620: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  Str ){.      z =
f630: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f640: 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29  ("(%d,\"%s\",%x)
f650: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f660: 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78     p->u.vtab.idx
f670: 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  Num, p->u.vtab.i
f680: 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62  dxStr, p->u.vtab
f690: 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
f6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
f6b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f6c0: 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75  ("(%d,%x)", p->u
f6d0: 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
f6e0: 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
f6f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f700: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f710: 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20  " %-19s", z);.  
f720: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f730: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
f740: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f750: 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20  SKIPSCAN ){.    
f760: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f770: 74 66 28 22 20 66 20 25 30 35 78 20 25 64 2d 25  tf(" f %05x %d-%
f780: 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
f790: 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b  p->nLTerm,p->nSk
f7a0: 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ip);.  }else{.  
f7b0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f7c0: 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 4e 20  intf(" f %05x N 
f7d0: 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c  %d", p->wsFlags,
f7e0: 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d   p->nLTerm);.  }
f7f0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
f800: 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c  rintf(" cost %d,
f810: 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65  %d,%d\n", p->rSe
f820: 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  tup, p->rRun, p-
f830: 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d  >nOut);.  if( p-
f840: 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69  >nLTerm && (sqli
f850: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
f860: 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
f870: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f880: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d  i=0; i<p->nLTerm
f890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ; i++){.      wh
f8a0: 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e  ereTermPrint(p->
f8b0: 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20  aLTerm[i], i);. 
f8c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
f8d0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
f8e0: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74   bulk memory int
f8f0: 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c  o a valid WhereL
f900: 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62 65 20  oop that can be 
f910: 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65  passed.** to whe
f920: 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d  reLoopClear harm
f930: 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  lessly..*/.stati
f940: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
f950: 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  Init(WhereLoop *
f960: 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  p){.  p->aLTerm 
f970: 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  = p->aLTermSpace
f980: 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  ;.  p->nLTerm = 
f990: 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  0;.  p->nLSlot =
f9a0: 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c   ArraySize(p->aL
f9b0: 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d  TermSpace);.  p-
f9c0: 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a  >wsFlags = 0;.}.
f9d0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
f9e0: 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69   WhereLoop.u uni
f9f0: 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65  on.  Leave Where
fa00: 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61  Loop.pLTerm inta
fa10: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
fa20: 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
fa30: 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  rUnion(sqlite3 *
fa40: 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
fa50: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c  ){.  if( p->wsFl
fa60: 61 67 73 20 26 20 28 57 48 45 52 45 5f 56 49 52  ags & (WHERE_VIR
fa70: 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f  TUALTABLE|WHERE_
fa80: 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20  AUTO_INDEX) ){. 
fa90: 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
faa0: 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
fab0: 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70  ALTABLE)!=0 && p
fac0: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
fad0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
fae0: 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61  e3_free(p->u.vta
faf0: 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
fb00: 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
fb10: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ree = 0;.      p
fb20: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
fb30: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
fb40: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
fb50: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
fb60: 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74  X)!=0 && p->u.bt
fb70: 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
fb80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
fb90: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74  Free(db, p->u.bt
fba0: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree.pIndex->zCol
fbb0: 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
fbc0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
fbd0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
fbe0: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
fbf0: 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
fc00: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
fc10: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
fc20: 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
fc30: 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
fc40: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
fc50: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
fc60: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
fc70: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
fc80: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
fc90: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
fca0: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
fcb0: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
fcc0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ;.  whereLoopCle
fcd0: 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a  arUnion(db, p);.
fce0: 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
fcf0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  p);.}../*.** Inc
fd00: 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  rease the memory
fd10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
fd20: 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20  pLoop->aLTerm[] 
fd30: 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e  to be at least n
fd40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fd50: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
fd60: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
fd70: 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e  reLoop *p, int n
fd80: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
fd90: 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d  *paNew;.  if( p-
fda0: 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74  >nLSlot>=n ) ret
fdb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fdc0: 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20   n = (n+7)&~7;. 
fdd0: 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   paNew = sqlite3
fde0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
fdf0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
fe00: 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28  rm[0])*n);.  if(
fe10: 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75   paNew==0 ) retu
fe20: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
fe30: 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70  BKPT;.  memcpy(p
fe40: 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c  aNew, p->aLTerm,
fe50: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72   sizeof(p->aLTer
fe60: 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29  m[0])*p->nLSlot)
fe70: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  ;.  if( p->aLTer
fe80: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
fe90: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
fea0: 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  e(db, p->aLTerm)
feb0: 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
fec0: 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
fed0: 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
fee0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fef0: 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
ff00: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
ff10: 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
ff20: 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
ff30: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
ff40: 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
ff50: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
ff60: 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
ff70: 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
ff80: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
ff90: 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
ffa0: 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
ffb0: 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
ffc0: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
ffd0: 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
ffe0: 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
fff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10000 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
10010 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
10020 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
10030 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
10040 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
10050 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
10060 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
10070 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
10080 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
10090 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
100a0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
100b0 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
100c0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
100d0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
100e0 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
100f0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
10100 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
10110 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
10120 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
10130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10150 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
10160 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
10170 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
10180 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
10190 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
101a0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
101b0 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
101c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
101d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
101e0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
101f0 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
10200 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
10210 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
10220 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
10230 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
10240 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  WInfo) ){.    in
10250 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
10260 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
10270 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
10280 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
10290 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
102a0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i];.      if( pL
102b0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26 20  evel->pWLoop && 
102c0 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
102d0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
102e0 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20 20  _IN_ABLE) ){.   
102f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
10300 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
10310 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
10320 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10330 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
10340 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
10350 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
10360 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
10370 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
10380 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
10390 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
103a0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
103b0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
103c0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
103d0 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
103e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
103f0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
10400 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
10410 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
10420 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10430 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
10440 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
10450 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
10460 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
10470 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
10480 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
10490 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69  .**   (3)  X ski
104a0 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d  ps at least as m
104b0 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59  any columns as Y
104c0 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
104d0 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
104e0 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
104f0 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
10500 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
10510 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
10520 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
10530 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
10540 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
10550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
10560 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10570 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
10580 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
10590 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
105a0 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
105b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
105c0 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
105d0 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
105e0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
105f0 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
10600 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
10610 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72 75  d.  The third ru
10620 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  le.** was added 
10630 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65  because if X use
10640 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73  s skip-scan less
10650 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c   than Y it still
10660 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76   might.** deserv
10670 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65  e a lower cost e
10680 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70  ven if it is a p
10690 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
106a0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
106b0 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
106c0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
106d0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
106e0 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
106f0 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
10700 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
10710 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10720 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
10730 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
10740 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
10750 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
10760 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
10770 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
10780 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
10790 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
107a0 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
107b0 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
107c0 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b   }.  if( pY->nSk
107d0 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29  ip > pX->nSkip )
107e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
107f0 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
10800 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
10810 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
10820 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
10830 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
10840 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
10850 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
10860 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
10870 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
10880 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
10890 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
108a0 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
108b0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
108c0 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d   pX->aLTerm[i]==
108d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
108e0 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65    for(j=pY->nLTe
108f0 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
10900 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e  {.      if( pY->
10910 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61  aLTerm[j]==pX->a
10920 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b  LTerm[i] ) break
10930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10940 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  j<0 ) return 0; 
10950 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73   /* X not a subs
10960 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65  et of Y since te
10970 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64  rm X[i] not used
10980 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72   by Y */.  }.  r
10990 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
109a0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
109b0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
109c0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
109d0 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
109e0 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
109f0 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
10a00 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
10a10 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
10a20 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
10a30 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
10a40 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
10a50 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
10a60 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
10a70 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
10a80 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
10a90 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
10aa0 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
10ab0 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
10ac0 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
10ad0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10ae0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
10af0 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
10b00 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
10b10 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
10b20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
10b30 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
10b40 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
10b50 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
10b60 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
10b70 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
10b80 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
10b90 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
10ba0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
10bb0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
10bc0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
10bd0 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
10be0 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
10bf0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10c00 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
10c10 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
10c20 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
10c30 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
10c40 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
10c50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
10c60 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
10c70 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
10c80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
10c90 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43    if( whereLoopC
10ca0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
10cb0 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  et(p, pTemplate)
10cc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
10cd0 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
10ce0 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74  st downward so t
10cf0 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65  hat it is cheape
10d00 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20  r than its .    
10d10 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a    ** subset p. *
10d20 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10d30 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10d40 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10d50 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10d60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10d70 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10d80 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10d90 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10da0 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29  rRun, p->nOut-1)
10db0 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
10dc0 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
10dd0 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10de0 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10df0 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Out - 1;.    }el
10e00 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  se if( whereLoop
10e10 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10e20 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  set(pTemplate, p
10e30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
10e40 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
10e50 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68  ost upward so th
10e60 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65  at it is costlie
10e70 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20  r than p since. 
10e80 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74       ** pTemplat
10e90 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  e is a proper su
10ea0 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20  bset of p */.   
10eb0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
10ec0 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
10ed0 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
10ee0 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10f10 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
10f20 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
10f30 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20   p->nOut+1));.  
10f40 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
10f50 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
10f60 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
10f70 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
10f80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
10f90 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
10fa0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
10fb0 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
10fc0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
10fd0 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
10fe0 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
10ff0 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
11000 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
11010 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
11020 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
11030 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
11040 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
11050 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
11060 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
11070 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
11080 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
11090 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
110a0 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
110b0 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
110c0 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
110d0 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
110e0 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
110f0 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
11100 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
11110 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
11120 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
11130 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
11140 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
11150 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
11160 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
11170 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
11180 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
11190 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
111a0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
111b0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
111c0 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
111d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
111e0 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
111f0 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
11200 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
11210 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
11220 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
11230 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
11240 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
11250 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
11260 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
11270 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
11280 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
11290 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
112a0 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
112b0 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
112c0 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
112d0 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
112e0 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
112f0 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
11300 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
11310 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
11320 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
11330 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
11340 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
11350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
11360 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
11370 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
11380 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
11390 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
113a0 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
113b0 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
113c0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
113d0 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
113e0 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
113f0 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
11400 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
11410 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
11420 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
11430 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
11440 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
11450 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
11460 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
11470 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
11480 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
11490 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
114a0 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
114b0 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
114c0 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
114d0 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
114e0 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
114f0 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
11500 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
11510 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
11520 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
11530 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
11540 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11550 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
11560 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
11570 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
11580 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
11590 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
115a0 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
115b0 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
115c0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
115d0 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
115e0 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
115f0 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
11600 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
11610 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73  ic index. Unless
11620 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63   it is a skip-sc
11630 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  an. */.    if( (
11640 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
11650 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
11660 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
11670 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a  late->nSkip)==0.
11680 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
11690 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
116a0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
116b0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
116c0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
116d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d  ERE_COLUMN_EQ)!=
116e0 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72  0.     && (p->pr
116f0 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
11700 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
11710 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
11720 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
11730 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11740 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
11750 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
11760 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
11770 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
11780 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
11790 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
117a0 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
117b0 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
117c0 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
117d0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
117e0 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
117f0 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
11800 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
11810 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
11820 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
11830 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
11840 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
11850 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
11860 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
11870 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
11880 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
11890 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
118a0 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
118b0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
118c0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
118f0 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
11900 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
11930 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
11940 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
11950 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
11960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11970 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
11980 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
11990 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
119a0 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
119b0 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
119c0 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
119d0 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
119e0 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
119f0 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
11a00 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
11a10 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
11a20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
11a30 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
11a40 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
11a50 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
11a60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11a70 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
11a80 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
11a90 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
11aa0 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
11ab0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
11ac0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
11ad0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11af0 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
11b00 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
11b10 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
11b40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
11b50 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
11b60 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
11b70 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
11b80 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
11b90 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
11ba0 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
11bb0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
11bc0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
11bd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11be0 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
11bf0 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
11c00 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
11c10 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
11c20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
11c30 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
11c40 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
11c50 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
11c60 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
11c70 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
11c80 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
11c90 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
11ca0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
11cb0 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
11cc0 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
11cd0 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
11ce0 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
11cf0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
11d00 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
11d10 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
11d20 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
11d30 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
11d40 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
11d50 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
11d60 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
11d70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
11d80 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11d90 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
11da0 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
11db0 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
11dc0 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
11dd0 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
11de0 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
11df0 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
11e00 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
11e10 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
11e20 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
11e30 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
11e40 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
11e50 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
11e60 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
11e70 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
11e80 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
11e90 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
11ea0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
11eb0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
11ec0 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
11ed0 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
11ee0 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
11ef0 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
11f00 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
11f10 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
11f20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
11f30 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
11f40 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
11f50 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
11f60 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
11f70 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
11f80 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
11f90 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
11fa0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
11fb0 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
11fc0 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
11fd0 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
11fe0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
11ff0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
12000 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
12010 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
12020 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
12030 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
12040 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
12050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
12060 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
12070 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
12080 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
12090 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
120a0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
120b0 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
120c0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
120d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
120e0 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
120f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
12100 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  e->db;.  int rc;
12110 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64  ..  /* If pBuild
12120 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65  er->pOrSet is de
12130 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79  fined, then only
12140 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   keep track of t
12150 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e  he costs.  ** an
12160 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a  d prereqs..  */.
12170 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e    if( pBuilder->
12180 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20 20  pOrSet!=0 ){.   
12190 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d 3e   if( pTemplate->
121a0 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57 48  nLTerm ){.#if WH
121b0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
121c0 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20 70  .      u16 n = p
121d0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d  Builder->pOrSet-
121e0 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  >n;.      int x 
121f0 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  =.#endif.      w
12200 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42 75  hereOrInsert(pBu
12210 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20 70  ilder->pOrSet, p
12220 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
12230 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  , pTemplate->rRu
12240 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
12270 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48 45  ->nOut);.#if WHE
12280 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
12290 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
122a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
122b0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
122c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
122d0 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20  bugPrintf(x?"   
122e0 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72  or-%d:  ":"   or
122f0 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20  -X:  ", n);.    
12300 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
12310 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
12320 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
12330 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12340 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
12350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
12360 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  /* Look for an e
12370 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
12380 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69 74  p to replace wit
12390 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2f  h pTemplate.  */
123a0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75  .  whereLoopAdju
123b0 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e 70  stCost(pWInfo->p
123c0 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
123d0 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77 68  );.  ppPrev = wh
123e0 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
123f0 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r(&pWInfo->pLoop
12400 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 0a  s, pTemplate);..
12410 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30 20    if( ppPrev==0 
12420 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
12430 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
12440 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74 68   WhereLoop on th
12450 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 62  e list that is b
12460 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
12470 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f 20  n pTemplate, so 
12480 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65 6d  just ignore pTem
12490 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48 45  plate */.#if WHE
124a0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
124b0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69 66  /* 0x8 */.    if
124c0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
124d0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
124e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
124f0 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a 20  rintf("   skip: 
12500 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  ");.      whereL
12510 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
12520 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
12530 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
12540 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12550 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73 65  TE_OK;  .  }else
12560 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72 65  {.    p = *ppPre
12570 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  v;.  }..  /* If 
12580 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
12590 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68 61  int it means tha
125a0 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68 6f  t either p[] sho
125b0 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74 74  uld be overwritt
125c0 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54 65  en.  ** with pTe
125d0 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20  mplate[] if p[] 
125e0 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70 3d  exists, or if p=
125f0 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63  =NULL then alloc
12600 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57  ate a new.  ** W
12610 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73  hereLoop and ins
12620 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  ert it..  */.#if
12630 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
12640 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
12650 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12660 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12670 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20     if( p!=0 ){. 
12680 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12690 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63 65  gPrintf("replace
126a0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
126b0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 42  eLoopPrint(p, pB
126c0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
126d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
126e0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20  ebugPrintf("    
126f0 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77 68 65  add: ");.    whe
12700 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
12710 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
12720 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >pWC);.  }.#endi
12730 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  f.  if( p==0 ){.
12740 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
12750 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20  a new WhereLoop 
12760 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e  to add to the en
12770 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f  d of the list */
12780 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70  .    *ppPrev = p
12790 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
127a0 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
127b0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
127c0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
127d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
127e0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77 68 65  EM_BKPT;.    whe
127f0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
12800 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
12810 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12820 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
12830 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
12840 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
12850 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
12860 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
12870 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
12880 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
12890 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
128a0 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
128b0 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
128c0 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
128d0 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
128e0 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
128f0 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
12900 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
12910 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
12920 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
12930 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
12940 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
12950 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
12960 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
12970 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
12980 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12990 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
129a0 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
129b0 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
129c0 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
129d0 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
129e0 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
129f0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
12a00 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
12a10 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
12a20 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
12a30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12a40 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
12a50 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
12a60 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
12a70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12a80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
12a90 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
12aa0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
12ab0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
12ac0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 58 66  rc = whereLoopXf
12ad0 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
12ae0 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ate);.  if( (p->
12af0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
12b00 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
12b10 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
12b20 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
12b30 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
12b40 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
12b50 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  dex->tnum==0 ){.
12b60 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
12b70 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
12b80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12b90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  rc;.}../*.** Adj
12ba0 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ust the WhereLoo
12bb0 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77  p.nOut value dow
12bc0 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74  nward to account
12bd0 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
12be0 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
12bf0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
12c00 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68   the loop but wh
12c10 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ich are not used
12c20 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   by an.** index.
12c30 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  .*.** For every 
12c40 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12c50 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73  m that is not us
12c60 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a  ed by the index.
12c70 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61 73  ** and which has
12c80 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69   a truth probabi
12c90 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20 62 79  lity assigned by
12ca0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65   one of the like
12cb0 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b  lihood(),.** lik
12cc0 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65  ely(), or unlike
12cd0 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  ly() SQL functio
12ce0 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  ns, reduce the e
12cf0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a  stimated number.
12d00 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  ** of output row
12d10 73 20 62 79 20 74 68 65 20 70 72 6f 62 61 62 69  s by the probabi
12d20 6c 69 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a  lity specified..
12d30 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46  **.** TUNING:  F
12d40 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63  or every WHERE c
12d50 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
12d60 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74  is not used by t
12d70 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  he index.** and 
12d80 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68  which does not h
12d90 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20  ave an assigned 
12da0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
12db0 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a  y, heuristics.**
12dc0 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77   described below
12dd0 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 79   are used to try
12de0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
12df0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12e00 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20  ty..** TODO --> 
12e10 50 65 72 68 61 70 73 20 74 68 69 73 20 69 73 20  Perhaps this is 
12e20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63  something that c
12e30 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64  ould be improved
12e40 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61   by better.** ta
12e50 62 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a  ble statistics..
12e60 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20  **.** Heuristic 
12e70 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68 65  1:  Estimate the
12e80 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
12e90 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54  ty as 93.75%.  T
12ea0 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c  he 93.75%.** val
12eb0 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ue corresponds t
12ec0 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e  o -1 in LogEst n
12ed0 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73  otation, so this
12ee0 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74   means decrement
12ef0 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  .** the WhereLoo
12f00 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72  p.nOut field for
12f10 20 65 76 65 72 79 20 73 75 63 68 20 57 48 45 52   every such WHER
12f20 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  E clause term..*
12f30 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32  *.** Heuristic 2
12f40 3a 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73  :  If there exis
12f50 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  ts one or more W
12f60 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12f70 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  s of the.** form
12f80 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45   "x==EXPR" and E
12f90 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e  XPR is not a con
12fa0 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68  stant 0 or 1, th
12fb0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  en make sure the
12fc0 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74  .** final output
12fd0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73   row estimate is
12fe0 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e   no greater than
12ff0 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61   1/4 of the tota
13000 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  l number.** of r
13010 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
13020 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
13030 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 78  s, assume that x
13040 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74  ==EXPR will filt
13050 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61  er.** out at lea
13060 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f  st 3 out of 4 ro
13070 77 73 2e 20 20 49 66 20 45 58 50 52 20 69 73 20  ws.  If EXPR is 
13080 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68  -1 or 0 or 1, th
13090 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20  en maybe the.** 
130a0 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f  "x" column is bo
130b0 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31  olean or else -1
130c0 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61 20   or 0 or 1 is a 
130d0 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76  common default v
130e0 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22  alue.** on the "
130f0 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f  x" column and so
13100 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   in that case on
13110 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74 70 75  ly cap the outpu
13120 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a  t row estimate.*
13130 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64  * at 1/2 instead
13140 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74   of 1/4..*/.stat
13150 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
13160 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20  pOutputAdjust(. 
13170 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
13180 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  C,      /* The W
13190 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
131a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
131b0 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  p,      /* The l
131c0 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f  oop to adjust do
131d0 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45  wnward */.  LogE
131e0 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20  st nRow         
131f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13200 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69  rows in the enti
13210 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  re table */.){. 
13220 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
13230 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73  m, *pX;.  Bitmas
13240 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e  k notAllowed = ~
13250 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70  (pLoop->prereq|p
13260 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b  Loop->maskSelf);
13270 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
13280 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65    LogEst iReduce
13290 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f   = 0;    /* pLoo
132a0 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e  p->nOut should n
132b0 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69  ot exceed nRow-i
132c0 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73  Reduce */..  ass
132d0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
132e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
132f0 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20  O_INDEX)==0 );. 
13300 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
13310 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  m, pTerm=pWC->a;
13320 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d   i>0; i--, pTerm
13330 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
13340 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
13350 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20  ERM_VIRTUAL)!=0 
13360 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
13370 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
13380 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
13390 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69  Self)==0 ) conti
133a0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
133b0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
133c0 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20   notAllowed)!=0 
133d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
133e0 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54  for(j=pLoop->nLT
133f0 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
13400 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c  ){.      pX = pL
13410 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
13420 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20        if( pX==0 
13430 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13440 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20    if( pX==pTerm 
13450 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
13460 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d  f( pX->iParent>=
13470 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58  0 && (&pWC->a[pX
13480 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65  ->iParent])==pTe
13490 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
134a0 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b  }.    if( j<0 ){
134b0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
134c0 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
134d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
134e0 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  a truth probabil
134f0 69 74 79 20 69 73 20 73 70 65 63 69 66 69 65 64  ity is specified
13500 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c   using the likel
13510 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20  ihood() hints,. 
13520 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75         ** then u
13530 73 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  se the probabili
13540 74 79 20 70 72 6f 76 69 64 65 64 20 62 79 20 74  ty provided by t
13550 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20  he application. 
13560 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  */.        pLoop
13570 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d  ->nOut += pTerm-
13580 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
13590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
135a0 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e   /* In the absen
135b0 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74  ce of explicit t
135c0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69  ruth probabiliti
135d0 65 73 2c 20 75 73 65 20 68 65 75 72 69 73 74 69  es, use heuristi
135e0 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  cs to.        **
135f0 20 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61   guess a reasona
13600 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  ble truth probab
13610 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  ility. */.      
13620 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b    pLoop->nOut--;
13630 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
13640 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
13650 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20  O_EQ|WO_IS) ){. 
13660 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
13670 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70  Right = pTerm->p
13680 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
13690 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
136a0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
136b0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
136c0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
136d0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
136e0 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26 20 6b  pRight, &k) && k
136f0 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31 20 29  >=(-1) && k<=1 )
13700 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20  {.            k 
13710 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
13720 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13730 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20 20 20     k = 20;.     
13740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13750 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b 20 29   if( iReduce<k )
13760 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a 20 20   iReduce = k;.  
13770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13780 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13790 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52  pLoop->nOut > nR
137a0 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20 70 4c  ow-iReduce )  pL
137b0 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  oop->nOut = nRow
137c0 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f   - iReduce;.}../
137d0 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65 72 6d  * .** Term pTerm
137e0 20 69 73 20 61 20 76 65 63 74 6f 72 20 72 61 6e   is a vector ran
137f0 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ge comparison op
13800 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  eration. The fir
13810 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  st comparison.**
13820 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 63   in the vector c
13830 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  an be optimized 
13840 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 45 71  using column nEq
13850 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 54   of the index. T
13860 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
13870 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
13880 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65 63 74  l number of vect
13890 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74  or elements that
138a0 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
138b0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  as part of the r
138c0 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e  ange comparison.
138d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
138e0 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
138f0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57 48 45   is:.**.**   WHE
13900 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28 62 2c  RE a = ? AND (b,
13910 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f 2c 20   c, d) > (?, ?, 
13920 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74 68 65  ?).**.** and the
13930 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20   index:.**.**   
13940 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e 2e 2e  CREATE INDEX ...
13950 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20 64 2c   ON (a, b, c, d,
13960 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74   e).**.** then t
13970 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 75  his function wou
13980 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 69  ld be invoked wi
13990 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20 76 61  th nEq=1. The va
139a0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 0a  lue returned in.
139b0 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20  ** this case is 
139c0 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  3..*/.static int
139d0 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f   whereRangeVecto
139e0 72 4c 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  rLen(.  Parse *p
139f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
13a00 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13a10 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
13a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
13a30 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70 49 64 78  sor open on pIdx
13a40 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
13a50 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  x,         /* Th
13a60 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 75 73  e index to be us
13a70 65 64 20 66 6f 72 20 61 20 69 6e 65 71 75 61 6c  ed for a inequal
13a80 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ity constraint *
13a90 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20  /.  int nEq,    
13aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13ab0 65 72 20 6f 66 20 70 72 69 6f 72 20 65 71 75 61  er of prior equa
13ac0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
13ad0 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65 78 20 2a   on same index *
13ae0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
13af0 54 65 72 6d 20 20 20 20 20 2f 2a 20 54 68 65 20  Term     /* The 
13b00 76 65 63 74 6f 72 20 69 6e 65 71 75 61 6c 69 74  vector inequalit
13b10 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  y constraint */.
13b20 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
13b30 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
13b40 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e 70 45 78  rSize(pTerm->pEx
13b50 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 6e  pr->pLeft);.  in
13b60 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d 20 4d  t i;..  nCmp = M
13b70 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64 78 2d 3e  IN(nCmp, (pIdx->
13b80 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29 29 3b  nColumn - nEq));
13b90 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43  .  for(i=1; i<nC
13ba0 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  mp; i++){.    /*
13bb0 20 54 65 73 74 20 69 66 20 63 6f 6d 70 61 72 69   Test if compari
13bc0 73 6f 6e 20 69 20 6f 66 20 70 54 65 72 6d 20 69  son i of pTerm i
13bd0 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  s compatible wit
13be0 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45 71 29  h column (i+nEq)
13bf0 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
13c00 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74 2c 20 65  index. If not, e
13c10 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e 20 20 2a  xit the loop.  *
13c20 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 3b 20  /.    char aff; 
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
13c50 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20  n affinity */.  
13c60 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20    char idxaff = 
13c70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13c80 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f 6c 75 6d  /* Indexed colum
13c90 6e 73 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  ns affinity */. 
13ca0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
13cb0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
13cc0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 63   /* Comparison c
13cd0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13ce0 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  e */.    Expr *p
13cf0 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  Lhs = pTerm->pEx
13d00 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 4c 69  pr->pLeft->x.pLi
13d10 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
13d20 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
13d30 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
13d40 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70  Right;.    if( p
13d50 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  Rhs->flags & EP_
13d60 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  xIsSelect ){.   
13d70 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e     pRhs = pRhs->
13d80 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
13d90 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
13da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13db0 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70  pRhs = pRhs->x.p
13dc0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13dd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13de0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 4c  Check that the L
13df0 48 53 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  HS of the compar
13e00 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
13e10 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 20 20   reference to.  
13e20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 63    ** the right c
13e30 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67  olumn of the rig
13e40 68 74 20 73 6f 75 72 63 65 20 74 61 62 6c 65 2e  ht source table.
13e50 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 73 6f   And that the so
13e60 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  rt.    ** order 
13e70 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
13e80 75 6d 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  umn is the same 
13e90 61 73 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  as the sort orde
13ea0 72 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  r of the.    ** 
13eb0 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65 78 20 63  leftmost index c
13ec0 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  olumn.  */.    i
13ed0 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54 4b 5f  f( pLhs->op!=TK_
13ee0 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c 7c 20  COLUMN .     || 
13ef0 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d 69 43  pLhs->iTable!=iC
13f00 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73  ur .     || pLhs
13f10 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d  ->iColumn!=pIdx-
13f20 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45 71 5d  >aiColumn[i+nEq]
13f30 20 0a 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e   .     || pIdx->
13f40 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b 6e 45 71  aSortOrder[i+nEq
13f50 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ]!=pIdx->aSortOr
13f60 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20 29 7b 0a  der[nEq].    ){.
13f70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f80 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
13f90 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d  ( pLhs->iColumn=
13fa0 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a 20 20 20  =XN_ROWID );.   
13fb0 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
13fc0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
13fd0 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 41  hs, sqlite3ExprA
13fe0 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29 3b 0a  ffinity(pLhs));.
13ff0 20 20 20 20 69 64 78 61 66 66 20 3d 20 73 71 6c      idxaff = sql
14000 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41  ite3TableColumnA
14010 66 66 69 6e 69 74 79 28 70 49 64 78 2d 3e 70 54  ffinity(pIdx->pT
14020 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69 43 6f 6c  able, pLhs->iCol
14030 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20 61 66  umn);.    if( af
14040 66 21 3d 69 64 78 61 66 66 20 29 20 62 72 65 61  f!=idxaff ) brea
14050 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  k;..    pColl = 
14060 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
14070 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
14080 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b  se, pLhs, pRhs);
14090 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
140a0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
140b0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
140c0 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
140d0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e  pIdx->azColl[i+n
140e0 45 71 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  Eq]) ) break;.  
140f0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
14100 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
14110 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
14120 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
14130 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
14140 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
14150 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
14160 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
14170 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
14180 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
14190 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
141a0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
141b0 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
141c0 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
141d0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
141e0 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
141f0 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
14200 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
14210 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
14220 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
14230 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
14240 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
14250 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
14260 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
14270 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
14280 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
14290 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
142a0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
142b0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
142c0 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
142d0 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
142e0 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
142f0 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
14300 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
14310 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
14320 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
14330 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
14340 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
14350 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
14360 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
14370 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
14380 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
14390 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
143a0 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
143b0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
143c0 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
143d0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
143e0 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
143f0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
14400 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
14410 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
14420 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
14430 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
14440 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
14450 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
14480 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
14490 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
144a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
144b0 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
144c0 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
144d0 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
144e0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
144f0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
14500 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
14510 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
14520 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
14530 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
14540 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14550 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
14560 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
14570 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
14580 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
14590 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
145a0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
145b0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
145d0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
145e0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
145f0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
14600 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
14610 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
14620 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
14630 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
14640 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14660 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
14670 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
14680 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
14690 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
146a0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
146b0 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
146c0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
146d0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
146e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
146f0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14700 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
14710 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14730 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
14740 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
14750 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
14760 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
14770 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
14780 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
14790 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
147a0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 42 74 6d    u16 saved_nBtm
147b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
147c0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
147d0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
147e0 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75  tree.nBtm */.  u
147f0 31 36 20 73 61 76 65 64 5f 6e 54 6f 70 3b 20 20  16 saved_nTop;  
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14810 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
14820 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   of pNew->u.btre
14830 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75 31 36 20  e.nTop */.  u16 
14840 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20  saved_nSkip;    
14850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14860 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
14870 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a   pNew->nSkip */.
14880 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
14890 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
148a0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
148b0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
148c0 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  lags */.  LogEst
148d0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
148e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
148f0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14900 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
14910 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14920 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
14930 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14940 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14970 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
14980 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c  e */.  LogEst rL
14990 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ogSize;         
149a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
149b0 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a  thm of table siz
149c0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
149d0 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74   *pTop = 0, *pBt
149e0 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e  m = 0; /* Top an
149f0 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63  d bottom range c
14a00 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
14a10 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
14a20 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62  ->pNew;.  if( db
14a30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14a50 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 57 48 45  OMEM_BKPT;.  WHE
14a60 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28  RETRACE(0x800, (
14a70 22 42 45 47 49 4e 20 61 64 64 42 74 72 65 65 49  "BEGIN addBtreeI
14a80 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 5c 6e  dx(%s), nEq=%d\n
14a90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14aa0 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e          pProbe->
14ab0 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75 2e 62  zName, pNew->u.b
14ac0 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20 20 61  tree.nEq));..  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 56 49  Flags & WHERE_VI
14af0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
14b00 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
14b10 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
14b20 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
14b30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
14b40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14b50 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
14b60 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
14b70 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
14b80 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
14b90 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3d 3d  ->u.btree.nBtm==
14ba0 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 );.    opMask 
14bb0 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
14bc0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
14bd0 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_LE|WO_ISNULL|
14be0 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28  WO_IS;.  }.  if(
14bf0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
14c00 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20  red ) opMask &= 
14c10 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  ~(WO_GT|WO_GE|WO
14c20 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61  _LT|WO_LE);..  a
14c30 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
14c40 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
14c50 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73  >nColumn );..  s
14c60 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d  aved_nEq = pNew-
14c70 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
14c80 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70 4e 65  saved_nBtm = pNe
14c90 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b  w->u.btree.nBtm;
14ca0 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70 20 3d 20  .  saved_nTop = 
14cb0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
14cc0 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69  op;.  saved_nSki
14cd0 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b  p = pNew->nSkip;
14ce0 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20  .  saved_nLTerm 
14cf0 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a  = pNew->nLTerm;.
14d00 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20    saved_wsFlags 
14d10 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b  = pNew->wsFlags;
14d20 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20  .  saved_prereq 
14d30 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a  = pNew->prereq;.
14d40 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70    saved_nOut = p
14d50 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65  New->nOut;.  pTe
14d60 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
14d70 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
14d80 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
14d90 43 75 72 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45  Cursor, saved_nE
14da0 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
14db0 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73             opMas
14dc0 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e  k, pProbe);.  pN
14dd0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
14de0 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
14df0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
14e00 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
14e10 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20  stLog(rSize);.  
14e20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
14e30 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b  _OK && pTerm!=0;
14e40 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
14e50 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a  anNext(&scan)){.
14e60 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54      u16 eOp = pT
14e70 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20  erm->eOperator; 
14e80 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
14e90 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  or pTerm->eOpera
14ea0 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  tor */.    LogEs
14eb0 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20  t rCostIdx;.    
14ec0 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a  LogEst nOutUnadj
14ed0 75 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  usted;        /*
14ee0 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28   nOut before IN(
14ef0 29 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75  ) and WHERE adju
14f00 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  stments */.    i
14f10 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64  nt nIn = 0;.#ifd
14f20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14f30 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
14f40 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
14f50 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
14f60 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
14f70 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f      if( (eOp==WO
14f80 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72  _ISNULL || (pTer
14f90 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f  m->wtFlags&TERM_
14fa0 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20  VNULL)!=0).     
14fb0 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  && indexColumnNo
14fc0 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61  tNull(pProbe, sa
14fd0 76 65 64 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ved_nEq).    ){.
14fe0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
14ff0 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f  /* ignore IS [NO
15000 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  T] NULL constrai
15010 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20  nts on NOT NULL 
15020 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
15030 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
15040 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
15050 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
15060 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
15070 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68   Do not allow th
15080 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66  e upper bound of
15090 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61   a LIKE optimiza
150a0 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74  tion range const
150b0 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20  raint.    ** to 
150c0 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72  mix with a lower
150d0 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f   range bound fro
150e0 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75  m some other sou
150f0 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rce */.    if( p
15100 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15110 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20  TERM_LIKEOPT && 
15120 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
15130 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e  ==WO_LT ) contin
15140 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
15150 6f 74 20 61 6c 6c 6f 77 20 49 53 20 63 6f 6e 73  ot allow IS cons
15160 74 72 61 69 6e 74 73 20 66 72 6f 6d 20 74 68 65  traints from the
15170 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
15180 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 0a   be used by the.
15190 20 20 20 20 2a 2a 20 72 69 67 68 74 20 74 61 62      ** right tab
151a0 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
151b0 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73 74 72 61  N.  Only constra
151c0 69 6e 74 73 20 69 6e 20 74 68 65 20 4f 4e 20 63  ints in the ON c
151d0 6c 61 75 73 65 20 61 72 65 0a 20 20 20 20 2a 2a  lause are.    **
151e0 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20   allowed */.    
151f0 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f  if( (pSrc->fg.jo
15200 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
15210 29 21 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78  )!=0.     && !Ex
15220 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
15230 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
15240 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26  romJoin).     &&
15250 20 28 65 4f 70 20 26 20 28 57 4f 5f 49 53 7c 57   (eOp & (WO_IS|W
15260 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20  O_ISNULL))!=0.  
15270 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
15280 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
15290 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
152a0 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  se( eOp & WO_ISN
152b0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ULL );.      con
152c0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
152d0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
152e0 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
152f0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
15300 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
15310 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  Eq;.    pNew->u.
15320 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76  btree.nBtm = sav
15330 65 64 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65  ed_nBtm;.    pNe
15340 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
15350 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20  = saved_nTop;.  
15360 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
15370 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
15380 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
15390 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
153a0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
153b0 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
153c0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
153d0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
153e0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
153f0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
15400 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
15410 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
15420 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
15430 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73  skSelf;..    ass
15440 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  ert( nInMul==0. 
15450 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
15460 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15470 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30  _COLUMN_NULL)!=0
15480 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
15490 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
154a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d  ERE_COLUMN_IN)!=
154b0 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  0 .        || (p
154c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
154d0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d  HERE_SKIPSCAN)!=
154e0 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  0 .    );..    i
154f0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  f( eOp & WO_IN )
15500 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
15510 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
15520 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pr;.      pNew->
15530 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
15540 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
15550 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
15560 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15570 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
15580 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
15590 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54  SELECT ...)":  T
155a0 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43  UNING: the SELEC
155b0 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77  T returns 25 row
155c0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  s */.        int
155d0 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   i;.        nIn 
155e0 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
155f0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
15600 28 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  (25) );..       
15610 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
15620 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  on may actually 
15630 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28  be of the form (
15640 78 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54  x, y) IN (SELECT
15650 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ...)..        **
15660 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
15670 65 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74  ere is a separat
15680 65 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20  e term for each 
15690 6f 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a  of (x) and (y)..
156a0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
156b0 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74  er, the nIn mult
156c0 69 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e  iplier should on
156d0 6c 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e  ly be applied on
156e0 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20  ce, not once.   
156f0 20 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68       ** for each
15700 20 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20   such term. The 
15710 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63  following loop c
15720 68 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d  hecks that pTerm
15730 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   is the.        
15740 2a 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65  ** first such te
15750 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73  rm in use, and s
15760 65 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20  ets nIn back to 
15770 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  0 if it is not. 
15780 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
15790 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65  =0; i<pNew->nLTe
157a0 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rm-1; i++){.    
157b0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
157c0 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65  aLTerm[i] && pNe
157d0 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45  w->aLTerm[i]->pE
157e0 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e  xpr==pExpr ) nIn
157f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
15800 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15810 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
15820 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
15830 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
15840 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78  ){.        /* "x
15850 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
15860 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
15870 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65      nIn = sqlite
15880 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78  3LogEst(pExpr->x
15890 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
158a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
158b0 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53  nIn>0 );  /* RHS
158c0 20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72   always has 2 or
158d0 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20   more terms...  
158e0 54 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20  The parser.     
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
15910 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
15920 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20  "x=?". */.      
15930 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
15940 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
15950 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  IS) ){.      int
15960 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e   iCol = pProbe->
15970 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e  aiColumn[saved_n
15980 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Eq];.      pNew-
15990 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
159a0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
159b0 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64     assert( saved
159c0 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74  _nEq==pNew->u.bt
159d0 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20  ree.nEq );.     
159e0 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f   if( iCol==XN_RO
159f0 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  WID .       || (
15a00 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c  iCol>0 && nInMul
15a10 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71  ==0 && saved_nEq
15a20 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  ==pProbe->nKeyCo
15a30 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  l-1).      ){.  
15a40 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
15a50 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69  0 && pProbe->uni
15a60 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  qNotNull==0 ){. 
15a70 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
15a80 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15a90 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
15aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ab0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
15ac0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
15ad0 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
15ae0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
15af0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
15b00 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
15b10 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
15b20 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
15b30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15b40 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
15b50 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
15b60 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
15b70 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
15b80 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45  ase( eOp & WO_GE
15b90 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
15ba0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
15bb0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
15bc0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
15bd0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
15be0 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52  ee.nBtm = whereR
15bf0 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20  angeVectorLen(. 
15c00 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
15c10 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
15c20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45  pProbe, saved_nE
15c30 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29  q, pTerm.      )
15c40 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
15c50 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
15c60 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
15c70 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15c80 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b   TERM_LIKEOPT ){
15c90 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67  .        /* Rang
15ca0 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61  e contraints tha
15cb0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20  t come from the 
15cc0 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
15cd0 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  n are.        **
15ce0 20 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20   always used in 
15cf0 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  pairs. */.      
15d00 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b    pTop = &pTerm[
15d10 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1];.        asse
15d20 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d  rt( (pTop-(pTerm
15d30 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d  ->pWC->a))<pTerm
15d40 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a  ->pWC->nTerm );.
15d50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15d60 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20  pTop->wtFlags & 
15d70 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a  TERM_LIKEOPT );.
15d80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15d90 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pTop->eOperator=
15da0 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =WO_LT );.      
15db0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
15dc0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
15dd0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
15de0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
15df0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
15e00 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
15e10 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a  Term++] = pTop;.
15e20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
15e30 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
15e40 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
15e50 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15e60 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  nTop = 1;.      
15e70 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
15e80 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26     assert( eOp &
15e90 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29   (WO_LT|WO_LE) )
15ea0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15eb0 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b  ( eOp & WO_LT );
15ec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15ed0 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a   eOp & WO_LE );.
15ee0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
15ef0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
15f00 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
15f10 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
15f20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15f30 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65  Top = whereRange
15f40 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20  VectorLen(.     
15f50 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72       pParse, pSr
15f60 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f  c->iCursor, pPro
15f70 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70  be, saved_nEq, p
15f80 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  Term.      );.  
15f90 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d      pTop = pTerm
15fa0 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28  ;.      pBtm = (
15fb0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15fc0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29  WHERE_BTM_LIMIT)
15fd0 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
15fe0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
15ff0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
16000 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20  Term-2] : 0;.   
16010 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
16020 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e  is point pNew->n
16030 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
16040 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
16050 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20   expected to.   
16060 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62   ** be visited b
16070 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  y the index scan
16080 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72   before consider
16090 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20  ing term pTerm, 
160a0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61  or the.    ** va
160b0 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20  lues of nIn and 
160c0 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72  nInMul. In other
160d0 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67   words, assuming
160e0 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a   that all .    *
160f0 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65  * "x IN(...)" te
16100 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64  rms are replaced
16110 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54   with "x = ?". T
16120 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  his block update
16130 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  s.    ** the val
16140 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
16150 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
16160 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e  pTerm (but not n
16170 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a  In/nInMul).  */.
16180 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
16190 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
161a0 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ut );.    if( pN
161b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
161c0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
161d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
161e0 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73  ust nOut using s
161f0 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e  tat3/stat4 data.
16200 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73   Or, if there is
16210 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a   no stat3/stat4.
16220 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75        ** data, u
16230 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20  sing some other 
16240 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20  estimate.  */.  
16250 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
16260 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
16270 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
16280 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d  op, pNew);.    }
16290 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
162a0 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e  nEq = ++pNew->u.
162b0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20  btree.nEq;.     
162c0 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
162d0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c  WO_ISNULL|WO_EQ|
162e0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a  WO_IN|WO_IS) );.
162f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16300 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
16310 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69  _nOut );.      i
16320 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
16330 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65  rob<=0 && pProbe
16340 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
16350 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  _nEq]>=0 ){.    
16360 20 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70      assert( (eOp
16370 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e   & WO_IN) || nIn
16380 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
16390 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
163a0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IN );.        
163b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  pNew->nOut += pT
163c0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
163d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
163e0 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  ut -= nIn;.     
163f0 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
16400 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16410 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
16420 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74      tRowcnt nOut
16430 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
16440 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20  ( nInMul==0 .   
16450 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
16460 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20  >nSample .      
16470 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
16480 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
16490 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20  >nSampleCol.    
164a0 20 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20       && ((eOp & 
164b0 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78  WO_IN)==0 || !Ex
164c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
164d0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  erm->pExpr, EP_x
164e0 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20  IsSelect)).     
164f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
16500 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
16510 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
16520 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
16530 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
16540 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a  L|WO_IS))!=0 ){.
16550 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16560 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45  case( eOp & WO_E
16570 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Q );.           
16580 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
16590 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
165a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
165b0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
165c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
165d0 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
165e0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
165f0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70  uilder, pExpr->p
16600 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  Right, &nOut);. 
16610 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
16620 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
16630 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
16640 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
16650 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
16660 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
16670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
16690 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
166a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
166b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
166c0 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20  TE_OK ) break;  
166d0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
166e0 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d  out of the pTerm
166f0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20   loop */.       
16700 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20     if( nOut ){. 
16710 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
16720 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
16730 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20  ogEst(nOut);.   
16740 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
16750 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f  w->nOut>saved_nO
16760 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  ut ) pNew->nOut 
16770 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
16780 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16790 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
167a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
167b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
167c0 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a  Out==0 ).#endif.
167d0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
167e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
167f0 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  = (pProbe->aiRow
16800 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50  LogEst[nEq] - pP
16810 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
16820 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20  t[nEq-1]);.     
16830 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
16840 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
16850 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
16860 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  G: If there is n
16870 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  o likelihood() v
16880 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61  alue, assume tha
16890 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20  t a .           
168a0 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c   ** "col IS NULL
168b0 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74  " expression mat
168c0 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61  ches twice as ma
168d0 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20  ny rows .       
168e0 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d       ** as (col=
168f0 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ?). */.         
16900 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
16910 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   10;.          }
16920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16930 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
16940 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f   Set rCostIdx to
16950 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   the cost of vis
16960 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72  iting selected r
16970 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64  ows in index. Ad
16980 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70  d.    ** it to p
16990 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68  New->rRun, which
169a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
169b0 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66  t to the cost of
169c0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
169d0 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65  * seek only. The
169e0 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  n, if this is a 
169f0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
16a00 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74  ex, add the cost
16a10 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74   of.    ** visit
16a20 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20  ing the rows in 
16a30 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20  the main table. 
16a40 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78   */.    rCostIdx
16a50 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20   = pNew->nOut + 
16a60 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
16a70 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e  szIdxRow)/pSrc->
16a80 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
16a90 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
16aa0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
16ab0 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73  d(rLogSize, rCos
16ac0 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28  tIdx);.    if( (
16ad0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
16ae0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
16af0 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29  WHERE_IPK))==0 )
16b00 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  {.      pNew->rR
16b10 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
16b20 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
16b30 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  , pNew->nOut + 1
16b40 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70  6);.    }.    Ap
16b50 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
16b60 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50  r(pNew->rRun, pP
16b70 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f  robe->pTable->co
16b80 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f  stMult);..    nO
16b90 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70  utUnadjusted = p
16ba0 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70  New->nOut;.    p
16bb0 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e  New->rRun += nIn
16bc0 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70  Mul + nIn;.    p
16bd0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e  New->nOut += nIn
16be0 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77  Mul + nIn;.    w
16bf0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
16c00 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  just(pBuilder->p
16c10 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
16c20 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
16c30 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
16c40 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20  der, pNew);..   
16c50 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
16c60 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
16c70 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
16c80 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
16c90 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65  ved_nOut;.    }e
16ca0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
16cb0 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64  >nOut = nOutUnad
16cc0 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  justed;.    }.. 
16cd0 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
16ce0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
16cf0 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20  P_LIMIT)==0.    
16d00 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
16d10 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  e.nEq<pProbe->nC
16d20 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20  olumn.    ){.   
16d30 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
16d40 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
16d50 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
16d60 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
16d70 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
16d80 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
16d90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16da0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
16db0 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64  STAT4.    pBuild
16dc0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
16dd0 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
16de0 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72  f.  }.  pNew->pr
16df0 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65  ereq = saved_pre
16e00 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  req;.  pNew->u.b
16e10 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
16e20 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  _nEq;.  pNew->u.
16e30 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76  btree.nBtm = sav
16e40 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d  ed_nBtm;.  pNew-
16e50 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
16e60 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e  saved_nTop;.  pN
16e70 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ew->nSkip = save
16e80 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d  d_nSkip;.  pNew-
16e90 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
16ea0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
16eb0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
16ec0 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
16ed0 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
16ee0 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64  rm;..  /* Consid
16ef0 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d  er using a skip-
16f00 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72  scan if there ar
16f10 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
16f20 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
16f30 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
16f40 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
16f50 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
16f60 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76  x, and if the av
16f70 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  erage.  ** numbe
16f80 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20  r of repeats in 
16f90 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
16fa0 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20  rms is at least 
16fb0 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  18. .  **.  ** T
16fc0 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20  he magic number 
16fd0 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f  18 is selected o
16fe0 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74  n the basis that
16ff0 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77   scanning 17 row
17000 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74  s.  ** is almost
17010 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20   always quicker 
17020 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65  than an index se
17030 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20  ek (even though 
17040 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  if the index.  *
17050 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  * contains fewer
17060 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20   than 2^17 rows 
17070 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77  we assume otherw
17080 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72  ise in other par
17090 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ts of.  ** the c
170a0 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20  ode). And, even 
170b0 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  if it is not, it
170c0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74   should not be t
170d0 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20  oo much slower. 
170e0 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68  .  ** On the oth
170f0 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74  er hand, the ext
17100 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65  ra seeks could e
17110 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e  nd up being sign
17120 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d  ificantly.  ** m
17130 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20  ore expensive.  
17140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d  */.  assert( 42=
17150 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
17160 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65  8) );.  if( save
17170 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b  d_nEq==saved_nSk
17180 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  ip.   && saved_n
17190 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq+1<pProbe->nKe
171a0 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62  yCol.   && pProb
171b0 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30  e->noSkipScan==0
171c0 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  .   && pProbe->a
171d0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
171e0 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20  _nEq+1]>=42  /* 
171f0 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20  TUNING: Minimum 
17200 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f  for skip-scan */
17210 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65  .   && (rc = whe
17220 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
17230 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
17240 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f  erm+1))==SQLITE_
17250 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45  OK.  ){.    LogE
17260 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e  st nIter;.    pN
17270 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
17280 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  +;.    pNew->nSk
17290 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ip++;.    pNew->
172a0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
172b0 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  erm++] = 0;.    
172c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
172d0 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b   WHERE_SKIPSCAN;
172e0 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72  .    nIter = pPr
172f0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17300 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50  [saved_nEq] - pP
17310 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
17320 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a  t[saved_nEq+1];.
17330 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
17340 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20  = nIter;.    /* 
17350 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65  TUNING:  Because
17360 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69   uncertainties i
17370 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  n the estimates 
17380 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75  for skip-scan qu
17390 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64  eries,.    ** ad
173a0 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20  d a 1.375 fudge 
173b0 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73  factor to make s
173c0 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c  kip-scan slightl
173d0 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a  y less likely. *
173e0 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35  /.    nIter += 5
173f0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
17400 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
17410 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
17420 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
17430 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
17440 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
17450 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  t;.    pNew->u.b
17460 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
17470 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
17480 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
17490 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  kip;.    pNew->w
174a0 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
174b0 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57  sFlags;.  }..  W
174c0 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
174d0 20 28 22 45 4e 44 20 61 64 64 42 74 72 65 65 49   ("END addBtreeI
174e0 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20  dx(%s), nEq=%d, 
174f0 72 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%d\n",.      
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73  pProbe->zName, s
17520 61 76 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a  aved_nEq, rc));.
17530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17540 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75  /*.** Return Tru
17550 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
17560 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20  ble that pIndex 
17570 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20  might be useful 
17580 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69  in.** implementi
17590 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
175a0 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64  clause in pBuild
175b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
175c0 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64   False if pBuild
175d0 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  er does not cont
175e0 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ain an ORDER BY 
175f0 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20  clause or.** if 
17600 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
17610 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65  for pIndex to be
17620 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65   useful in imple
17630 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  menting that.** 
17640 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
17650 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
17660 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74  ndexMightHelpWit
17670 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72  hOrderBy(.  Wher
17680 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
17690 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20  uilder,.  Index 
176a0 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69  *pIndex,.  int i
176b0 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72  Cursor.){.  Expr
176c0 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70  List *pOB;.  Exp
176d0 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b  rList *aColExpr;
176e0 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a  .  int ii, jj;..
176f0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55    if( pIndex->bU
17700 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72  nordered ) retur
17710 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20  n 0;.  if( (pOB 
17720 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
17730 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30  fo->pOrderBy)==0
17740 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
17750 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d  or(ii=0; ii<pOB-
17760 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
17770 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
17780 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
17790 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69  Collate(pOB->a[i
177a0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
177b0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
177c0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
177d0 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
177e0 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r ){.      if( p
177f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
17800 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
17810 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
17820 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
17830 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
17840 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
17850 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
17860 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
17870 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17880 7d 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45  }else if( (aColE
17890 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43  xpr = pIndex->aC
178a0 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20  olExpr)!=0 ){.  
178b0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
178c0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
178d0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
178e0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
178f0 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58  olumn[jj]!=XN_EX
17900 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  PR ) continue;. 
17910 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
17920 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
17930 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b  xpr,aColExpr->a[
17940 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f  jj].pExpr,iCurso
17950 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
17960 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17980 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17990 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
179a0 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77  turn a bitmask w
179b0 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65  here 1s indicate
179c0 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73   that the corres
179d0 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  ponding column o
179e0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69  f.** the table i
179f0 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  s used by an ind
17a00 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69  ex.  Only the fi
17a10 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61  rst 63 columns a
17a20 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a  re considered..*
17a30 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
17a40 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28   columnsInIndex(
17a50 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
17a60 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20  Bitmask m = 0;. 
17a70 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
17a80 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b  pIdx->nColumn-1;
17a90 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
17aa0 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61   int x = pIdx->a
17ab0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
17ac0 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20  if( x>=0 ){.    
17ad0 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
17ae0 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
17af0 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32  stcase( x==BMS-2
17b00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c   );.      if( x<
17b10 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53  BMS-1 ) m |= MAS
17b20 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20  KBIT(x);.    }. 
17b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d   }.  return m;.}
17b40 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  ../* Check to se
17b50 65 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69  e if a partial i
17b60 6e 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49  ndex with pPartI
17b70 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65  ndexWhere can be
17b80 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20   used.** in the 
17b90 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20  current query.  
17ba0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
17bb0 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c  t can be and fal
17bc0 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
17bd0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73  atic int whereUs
17be0 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
17bf0 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65  (int iTab, Where
17c00 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
17c10 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *pWhere){.  in
17c20 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
17c30 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65   *pTerm;.  while
17c40 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b  ( pWhere->op==TK
17c50 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  _AND ){.    if( 
17c60 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74  !whereUsablePart
17c70 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57  ialIndex(iTab,pW
17c80 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29  C,pWhere->pLeft)
17c90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
17ca0 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65   pWhere = pWhere
17cb0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20  ->pRight;.  }.  
17cc0 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
17cd0 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
17ce0 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
17cf0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
17d00 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
17d10 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
17d20 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
17d30 70 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65  pr(pExpr, pWhere
17d40 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26  , iTab) .     &&
17d50 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72   (!ExprHasProper
17d60 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
17d70 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d  mJoin) || pExpr-
17d80 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
17d90 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20  ==iTab).    ){. 
17da0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
17db0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17dc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
17dd0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
17de0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69  objects for a si
17df0 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68  ngle table of th
17e00 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65  e join where the
17e10 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65   table.** is ide
17e20 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69 6c  ntified by pBuil
17e30 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
17e40 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
17e50 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
17e60 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62  .** a b-tree tab
17e70 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61  le, not a virtua
17e80 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
17e90 68 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c  he costs (WhereL
17ea0 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65  oop.rRun) of the
17eb0 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64   b-tree loops ad
17ec0 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ded by this func
17ed0 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63  tion.** are calc
17ee0 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
17ef0 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66  s:.**.** For a f
17f00 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69  ull scan, assumi
17f10 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72  ng the table (or
17f20 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73   index) contains
17f30 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a   nRow rows:.**.*
17f40 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
17f50 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20  w * 3.0         
17f60 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75             // fu
17f70 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a  ll-table scan.**
17f80 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
17f90 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20   * K            
17fa0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
17fb0 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e  n of covering in
17fc0 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
17fd0 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29  = nRow * (K+3.0)
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63  // scan of non-c
18000 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
18010 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61  .** where K is a
18020 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
18030 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62  .1 and 3.0 set b
18040 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61  ased on the rela
18050 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74  tive .** estimat
18060 65 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  ed average size 
18070 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
18080 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a   table records..
18090 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64  **.** For an ind
180a0 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e  ex scan, where n
180b0 56 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d  Visit is the num
180c0 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77  ber of index row
180d0 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  s visited.** by 
180e0 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53  the scan, and nS
180f0 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65  eek is the numbe
18100 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74  r of seek operat
18110 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e  ions required on
18120 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62   .** the index b
18130 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  -tree:.**.**    
18140 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
18150 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a  (log(nRow) + K *
18160 20 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20   nVisit)        
18170 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e    // covering in
18180 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  dex.**     cost 
18190 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
181a0 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a  Row) + (K+3.0) *
181b0 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e   nVisit)    // n
181c0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
181d0 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  x.**.** Normally
181e0 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53  , nSeek is 1. nS
181f0 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74  eek values great
18200 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61  er than 1 come a
18210 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20  bout if the .** 
18220 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63  WHERE clause inc
18230 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e  ludes "x IN (...
18240 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69  .)" terms used i
18250 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22  n place of "x=?"
18260 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d  . Or when .** im
18270 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45  plicit "x IN (SE
18280 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29  LECT x FROM tbl)
18290 22 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65  " terms are adde
182a0 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73  d for skip-scans
182b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
182c0 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52  mated values (nR
182d0 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65  ow, nVisit, nSee
182e0 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e  k) often contain
182f0 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a   a large amount.
18300 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74  ** of uncertaint
18310 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  y.  For this rea
18320 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20  son, scoring is 
18330 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b  designed to pick
18340 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22   plans that.** "
18350 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72  do the least har
18360 6d 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61  m" if the estima
18370 74 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61  tes are inaccura
18380 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  te.  For example
18390 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29  , a.** log(nRow)
183a0 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74   factor is omitt
183b0 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f  ed from a non-co
183c0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
183d0 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a  n in order to.**
183e0 20 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e   bias the scorin
183f0 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73  g in favor of us
18400 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69  ing an index, si
18410 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61  nce the worst-ca
18420 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  se.** performanc
18430 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  e of using an in
18440 64 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65  dex is far bette
18450 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74  r than the worst
18460 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63  -case performanc
18470 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74  e.** of a full t
18480 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74  able scan..*/.st
18490 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
184a0 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68  opAddBtree(.  Wh
184b0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
184c0 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45  pBuilder, /* WHE
184d0 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
184e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
184f0 73 6b 20 6d 50 72 65 72 65 71 20 20 20 20 20 20  sk mPrereq      
18500 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
18510 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
18520 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
18530 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
18540 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
18550 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
18560 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
18570 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
18580 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
18590 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
185a0 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
185b0 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
185e0 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
185f0 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
18600 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74   LogEst aiRowEst
18610 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20  Pk[2];       /* 
18620 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b  The aiRowLogEst[
18630 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
18640 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
18650 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  16 aiColumnPk = 
18660 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
18670 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
18680 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
18690 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
186a0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
186b0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
186c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
186d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
186e0 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
186f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
18700 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
18710 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
18720 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
18730 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
18740 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
18750 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18760 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
18770 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18780 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
18790 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
187a0 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
187b0 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
187d0 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
187e0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
187f0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
18800 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
18810 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
18820 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
18830 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
18840 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
18850 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
18860 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
18870 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
18880 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
18890 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64     /* The parsed
188a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
188b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
188d0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
188e0 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e  eried */.  .  pN
188f0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
18900 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  New;.  pWInfo = 
18910 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
18920 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
18930 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
18940 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69  .  pSrc = pTabLi
18950 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
18960 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72  ab;.  pTab = pSr
18970 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d  c->pTab;.  pWC =
18980 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
18990 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
189a0 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
189b0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
189c0 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20  >pIBIndex ){.   
189d0 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
189e0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
189f0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
18a00 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
18a10 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
18a20 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d  c->pIBIndex;.  }
18a30 65 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77  else if( !HasRow
18a40 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
18a50 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70  pProbe = pTab->p
18a60 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
18a70 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
18a80 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
18a90 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20  ause.  Create a 
18aa0 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63  fake Index objec
18ab0 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a  t in local.    *
18ac0 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74  * variable sPk t
18ad0 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
18ae0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
18af0 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74  y index.  Make t
18b00 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20  his.    ** fake 
18b10 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20  index the first 
18b20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e  in a chain of In
18b30 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68  dex objects with
18b40 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c   all of the real
18b50 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  .    ** indices 
18b60 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
18b70 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20   Index *pFirst; 
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b90 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61   /* First of rea
18ba0 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  l indices on the
18bb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
18bc0 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
18bd0 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
18be0 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20    sPk.nKeyCol = 
18bf0 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  1;.    sPk.nColu
18c00 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
18c10 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
18c20 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
18c30 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69  aiRowLogEst = ai
18c40 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
18c50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
18c60 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
18c70 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
18c80 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20     sPk.szIdxRow 
18c90 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  = pTab->szTabRow
18ca0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
18cb0 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  [0] = pTab->nRow
18cc0 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  LogEst;.    aiRo
18cd0 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20  wEstPk[1] = 0;. 
18ce0 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
18cf0 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
18d00 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67      if( pSrc->fg
18d10 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
18d20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
18d30 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74  eal indices of t
18d40 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c  he table are onl
18d50 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20  y considered if 
18d60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54  the.      ** NOT
18d70 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69   INDEXED qualifi
18d80 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  er is omitted fr
18d90 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  om the FROM clau
18da0 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e  se */.      sPk.
18db0 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
18dc0 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65      }.    pProbe
18dd0 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72   = &sPk;.  }.  r
18de0 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f  Size = pTab->nRo
18df0 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53  wLogEst;.  rLogS
18e00 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
18e10 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ze);..#ifndef SQ
18e20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
18e30 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41  TIC_INDEX.  /* A
18e40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
18e50 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
18e60 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20  der->pOrSet     
18e70 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20   /* Not part of 
18e80 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  an OR optimizati
18e90 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49  on */.   && (pWI
18ea0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
18eb0 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
18ec0 41 55 53 45 29 3d 3d 30 0a 20 20 20 26 26 20 28  AUSE)==0.   && (
18ed0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
18ee0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
18ef0 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30  TE_AutoIndex)!=0
18f00 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42  .   && pSrc->pIB
18f10 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a  Index==0      /*
18f20 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20   Has no INDEXED 
18f30 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
18f40 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74  && !pSrc->fg.not
18f50 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73  Indexed   /* Has
18f60 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   no NOT INDEXED 
18f70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
18f80 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 20  HasRowid(pTab)  
18f90 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49         /* Not WI
18fa0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
18fb0 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e  e. (FIXME: Why n
18fc0 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70  ot?) */.   && !p
18fd0 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  Src->fg.isCorrel
18fe0 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f  ated /* Not a co
18ff0 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
19000 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  y */.   && !pSrc
19010 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
19020 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72    /* Not a recur
19030 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  sive common tabl
19040 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  e expression. */
19050 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
19060 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
19070 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
19080 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
19090 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65  erm;.    WhereTe
190a0 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43  rm *pWCEnd = pWC
190b0 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
190c0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
190d0 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49  pWC->a; rc==SQLI
190e0 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70  TE_OK && pTerm<p
190f0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
19100 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
19110 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
19120 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
19130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
19140 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
19150 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
19160 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  rc, 0) ){.      
19170 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
19180 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nEq = 1;.       
19190 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
191a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
191b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
191c0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
191d0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
191e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
191f0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
19200 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
19210 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
19220 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
19230 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
19240 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
19250 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
19260 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  X*N*log2(N) wher
19270 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
19280 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
19290 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
192a0 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
192b0 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37  and where X is 7
192c0 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72   (LogEst=28) for
192d0 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20   normal.        
192e0 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33  ** tables or 1.3
192f0 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f  75 (LogEst=4) fo
19300 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
19310 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c  ueries.  The val
19320 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ue.        ** of
19330 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f   X is smaller fo
19340 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
19350 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74  ueries so that t
19360 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
19370 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
19380 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73   be more aggress
19390 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61  ive about genera
193a0 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69  ting automatic i
193b0 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20  ndexes for.     
193c0 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65     ** those obje
193d0 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65  cts, since there
193e0 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69   is no opportuni
193f0 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61  ty to add schema
19400 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
19410 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65  xes on subquerie
19420 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a  s and views. */.
19430 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
19440 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
19450 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20  + rSize + 4;.   
19460 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
19470 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
19480 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
19490 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
194a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
194b0 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b  w->rSetup += 24;
194c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
194d0 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
194e0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65  iplier(pNew->rSe
194f0 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  tup, pTab->costM
19500 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ult);.        if
19510 28 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30  ( pNew->rSetup<0
19520 20 29 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20   ) pNew->rSetup 
19530 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
19540 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64  TUNING: Each ind
19550 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73  ex lookup yields
19560 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20   20 rows in the 
19570 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20  table.  This.   
19580 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20       ** is more 
19590 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67  than the usual g
195a0 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c  uess of 10 rows,
195b0 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e   since we have n
195c0 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  o way.        **
195d0 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20   of knowing how 
195e0 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e  selective the in
195f0 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  dex will ultimat
19600 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c  ely be.  It woul
19610 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  d.        ** not
19620 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65   be unreasonable
19630 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61   to make this va
19640 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e  lue much larger.
19650 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
19660 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73  ->nOut = 43;  as
19670 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65  sert( 43==sqlite
19680 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20  3LogEst(20) );. 
19690 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
196a0 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
196b0 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e  tAdd(rLogSize,pN
196c0 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  ew->nOut);.     
196d0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
196e0 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   = WHERE_AUTO_IN
196f0 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
19700 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
19710 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  req | pTerm->pre
19720 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
19730 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
19740 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
19750 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
19760 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
19770 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19780 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
19790 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
197a0 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20  er all indices. 
197b0 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
197c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
197d0 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
197e0 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74  be->pNext, iSort
197f0 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
19800 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
19810 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
19820 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
19830 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e  tialIndex(pSrc->
19840 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50  iCursor, pWC, pP
19850 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
19860 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65  ere) ){.      te
19870 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54  stcase( pNew->iT
19880 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  ab!=pSrc->iCurso
19890 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63  r );  /* See tic
198a0 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d  ket [98d973b8f5]
198b0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
198c0 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
198d0 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
198e0 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
198f0 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
19900 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
19910 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
19920 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
19930 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
19940 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
19950 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  m = 0;.    pNew-
19960 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
19970 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  0;.    pNew->nSk
19980 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ip = 0;.    pNew
19990 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
199a0 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
199b0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
199c0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
199d0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
199e0 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77  Prereq;.    pNew
199f0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
19a00 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
19a10 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
19a20 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
19a30 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
19a40 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
19a50 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
19a60 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
19a70 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
19a80 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
19a90 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
19aa0 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
19ab0 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
19ac0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
19ad0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
19ae0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
19af0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
19b00 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
19b10 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
19b20 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
19b30 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
19b40 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
19b50 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
19b60 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
19b70 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
19b80 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
19b90 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
19ba0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
19bb0 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
19bc0 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30  e scan is (N*3.0
19bd0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ). */.      pNew
19be0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
19bf0 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79   16;.      Apply
19c00 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
19c10 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
19c20 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
19c30 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
19c40 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
19c50 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
19c60 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
19c70 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
19c80 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
19c90 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
19ca0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
19cb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
19cc0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
19cd0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
19ce0 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
19cf0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
19d00 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
19d10 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
19d20 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
19d30 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
19d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
19d50 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
19d60 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
19d70 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
19d80 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
19d90 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
19da0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
19db0 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
19dc0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
19dd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
19de0 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
19df0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
19e00 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
19e10 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
19e20 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50     || pProbe->pP
19e30 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
19e40 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
19e50 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
19e60 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
19e70 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
19e80 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
19e90 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
19ea0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
19eb0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
19ec0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
19ed0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
19ee0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
19ef0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
19f00 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
19f10 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
19f20 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
19f30 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
19f40 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
19f50 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
19f60 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
19f70 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
19f80 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
19f90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
19fa0 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
19fb0 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
19fc0 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
19fd0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
19fe0 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
19ff0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1a000 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
1a010 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1a020 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
1a030 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  e rows. */.     
1a040 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
1a050 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a  rSize + 1 + (15*
1a060 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
1a070 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  )/pTab->szTabRow
1a080 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21  ;.        if( m!
1a090 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a0a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1a0b0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
1a0c0 65 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20  ex scan, add in 
1a0d0 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
1a0e0 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74        ** doing t
1a0f0 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54  able lookups.  T
1a100 68 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20  he cost will be 
1a110 33 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  3x the number of
1a120 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  .          ** lo
1a130 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74  okups.  Take int
1a140 6f 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20  o account WHERE 
1a150 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
1a160 74 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20  t can be.       
1a170 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20     ** satisfied 
1a180 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
1a190 6e 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64  ndex, and that d
1a1a0 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  o not require a.
1a1b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1a1c0 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20  le lookup. */.  
1a1d0 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e          LogEst n
1a1e0 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b  Lookup = rSize +
1a1f0 20 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f   16;  /* Base co
1a200 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20  st:  N*3 */.    
1a210 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1a220 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72          int iCur
1a230 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
1a240 3b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  ;.          Wher
1a250 65 43 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20  eClause *pWC2 = 
1a260 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
1a270 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
1a280 3b 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d  ; ii<pWC2->nTerm
1a290 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1a2a0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1a2b0 70 54 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61  pTerm = &pWC2->a
1a2c0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [ii];.          
1a2d0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
1a2e0 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
1a2f0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69  (pTerm->pExpr, i
1a300 43 75 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a  Cur, pProbe) ){.
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1a320 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1a330 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
1a340 2a 20 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65  * pTerm can be e
1a350 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a  valuated using j
1a360 75 73 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20  ust the index.  
1a370 53 6f 20 72 65 64 75 63 65 0a 20 20 20 20 20 20  So reduce.      
1a380 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70        ** the exp
1a390 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
1a3a0 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63  table lookups ac
1a3b0 63 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20  cordingly */.   
1a3c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
1a3d0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
1a3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a3f0 20 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65    nLookup += pTe
1a400 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
1a410 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1a420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a430 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20  nLookup--;.     
1a440 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
1a450 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1a460 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20  (WO_EQ|WO_IS) ) 
1a470 6e 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20  nLookup -= 19;. 
1a480 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a4a0 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e     .          pN
1a4b0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
1a4c0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
1a4d0 2d 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29  ->rRun, nLookup)
1a4e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a4f0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
1a500 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
1a510 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  un, pTab->costMu
1a520 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  lt);.        whe
1a530 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
1a540 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
1a550 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ize);.        rc
1a560 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1a570 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1a580 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w);.        pNew
1a590 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
1a5a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1a5b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a5c0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1a5d0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1a5e0 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
1a5f0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30   pSrc, pProbe, 0
1a600 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1a610 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
1a620 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74  _STAT4.    sqlit
1a630 65 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65  e3Stat4ProbeFree
1a640 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29  (pBuilder->pRec)
1a650 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
1a660 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20  nRecValid = 0;. 
1a670 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65     pBuilder->pRe
1a680 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
1a690 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1a6a0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
1a6b0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
1a6c0 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
1a6d0 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
1a6e0 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
1a6f0 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
1a700 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
1a710 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a730 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1a740 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
1a750 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c 72 65  pIdxInfo is alre
1a760 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ady populated wi
1a770 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  th all constrain
1a780 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62  ts that may.** b
1a790 65 20 75 73 65 64 20 62 79 20 74 68 65 20 76 69  e used by the vi
1a7a0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64 65 6e  rtual table iden
1a7b0 74 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  tified by pBuild
1a7c0 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
1a7d0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
1a7e0 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65 74 20   marks a subset 
1a7f0 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74 72 61  of those constra
1a800 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69 6e 76  ints usable, inv
1a810 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42 65 73  okes the.** xBes
1a820 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 6e  tIndex method an
1a830 64 20 61 64 64 73 20 74 68 65 20 72 65 74 75 72  d adds the retur
1a840 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42 75 69  ned plan to pBui
1a850 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f  lder..**.** A co
1a860 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61 72 6b  nstraint is mark
1a870 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a 2a  ed usable if:.**
1a880 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e 74  .**   * Argument
1a890 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63 61 74   mUsable indicat
1a8a0 65 73 20 74 68 61 74 20 69 74 73 20 70 72 65 72  es that its prer
1a8b0 65 71 75 69 73 69 74 65 73 20 61 72 65 20 61 76  equisites are av
1a8c0 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a  ailable, and.**.
1a8d0 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e 6f 74  **   * It is not
1a8e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
1a8f0 61 74 6f 72 73 20 73 70 65 63 69 66 69 65 64 20  ators specified 
1a900 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64 65 20  in the mExclude 
1a910 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20 20  mask passed.**  
1a920 20 20 20 61 73 20 74 68 65 20 66 6f 75 72 74 68     as the fourth
1a930 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69 63 68   argument (which
1a940 20 69 6e 20 70 72 61 63 74 69 63 65 20 69 73 20   in practice is 
1a950 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72 20  either WO_IN or 
1a960 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  0)..**.** Argume
1a970 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20 61 20  nt mPrereq is a 
1a980 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74  mask of tables t
1a990 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1a9a0 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a 2a  ned before the.*
1a9b0 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
1a9c0 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54 68 65  in question. The
1a9d0 73 65 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  se are added to 
1a9e0 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72 65 71  the plans prereq
1a9f0 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f 72  uisites.** befor
1aa00 65 20 69 74 20 69 73 20 61 64 64 65 64 20 74 6f  e it is added to
1aa10 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
1aa20 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
1aa30 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74 20 74  r *pbIn is set t
1aa40 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 70 6c  o true if the pl
1aa50 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42 75 69  an added to pBui
1aa60 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e 65  lder.** uses one
1aa70 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20 74   or more WO_IN t
1aa80 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20 6f  erms, or false o
1aa90 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1aaa0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1aab0 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1aac0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1aad0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
1aae0 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65  /* Mask of table
1ab10 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 75  s that must be u
1ab20 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  sed. */.  Bitmas
1ab30 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20 20 20  k mUsable,      
1ab40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ab50 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61 62 6c  k of usable tabl
1ab60 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78 63  es */.  u16 mExc
1ab70 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  lude,           
1ab80 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 6c 75          /* Exclu
1ab90 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67 20 74  de terms using t
1aba0 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73 20 2a  hese operators *
1abb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
1abc0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
1abd0 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 64  ,   /* Populated
1abe0 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42 65 73   object for xBes
1abf0 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  tIndex */.  u16 
1ac00 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20 20 20  mNoOmit,        
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ac20 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65 73 65  o not omit these
1ac30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1ac40 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20 20    int *pbIn     
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69    /* OUT: True i
1ac70 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 20 49  f plan uses an I
1ac80 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a  N(...) op */.){.
1ac90 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1aca0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
1acb0 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  WC;.  struct sql
1acc0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1acd0 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
1ace0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
1acf0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
1ad00 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
1ad10 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
1ad20 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
1ad30 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 78   int i;.  int mx
1ad40 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Term;.  int rc =
1ad50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68   SQLITE_OK;.  Wh
1ad60 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d 20  ereLoop *pNew = 
1ad70 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
1ad80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1ad90 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1ada0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 74  fo->pParse;.  st
1adb0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1adc0 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75 69 6c  m *pSrc = &pBuil
1add0 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61  der->pWInfo->pTa
1ade0 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
1adf0 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e  Tab];.  int nCon
1ae00 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
1ae10 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
1ae20 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 55 73  ..  assert( (mUs
1ae30 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71 29 3d  able & mPrereq)=
1ae40 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20 2a 70  =mPrereq );.  *p
1ae50 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  bIn = 0;.  pNew-
1ae60 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
1ae70 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  q;..  /* Set the
1ae80 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e 20   usable flag on 
1ae90 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 63 6f  the subset of co
1aea0 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69  nstraints identi
1aeb0 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20 61 72  fied by .  ** ar
1aec0 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65 20  guments mUsable 
1aed0 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a 2f  and mExclude. */
1aee0 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
1aef0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1af00 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
1af10 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
1af20 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28  nstraint;.  for(
1af30 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1af40 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
1af50 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54  s++){.    WhereT
1af60 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
1af70 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e 69  C->a[pIdxCons->i
1af80 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20  TermOffset];.   
1af90 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
1afa0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28  e = 0;.    if( (
1afb0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1afc0 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d 70  ht & mUsable)==p
1afd0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1afe0 74 20 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  t .     && (pTer
1aff0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d  m->eOperator & m
1b000 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20 20  Exclude)==0.    
1b010 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  ){.      pIdxCon
1b020 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
1b030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1b040 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
1b050 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66 20 74  tput fields of t
1b060 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
1b070 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
1b080 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61  */.  memset(pUsa
1b090 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
1b0a0 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72  sage[0])*nConstr
1b0b0 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28  aint);.  assert(
1b0c0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1b0d0 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29  oFreeIdxStr==0 )
1b0e0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
1b0f0 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
1b100 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
1b110 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  ;.  pIdxInfo->or
1b120 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
1b130 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  0;.  pIdxInfo->e
1b140 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
1b150 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
1b160 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49 64  (double)2;.  pId
1b170 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1b180 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70 49 64  Rows = 25;.  pId
1b190 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1b1a0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1b1b0 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69  >colUsed = (sqli
1b1c0 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e  te3_int64)pSrc->
1b1d0 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20 49  colUsed;..  /* I
1b1e0 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74 75 61  nvoke the virtua
1b1f0 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64  l table xBestInd
1b200 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  ex() method */. 
1b210 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e   rc = vtabBestIn
1b220 64 65 78 28 70 50 61 72 73 65 2c 20 70 53 72 63  dex(pParse, pSrc
1b230 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  ->pTab, pIdxInfo
1b240 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1b250 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54 65  turn rc;..  mxTe
1b260 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72  rm = -1;.  asser
1b270 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
1b280 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
1b290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1b2a0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70  nstraint; i++) p
1b2b0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d  New->aLTerm[i] =
1b2c0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
1b2d0 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
1b2e0 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
1b2f0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1b300 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
1b310 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
1b320 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28  nstraint;.  for(
1b330 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1b340 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
1b350 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54  s++){.    int iT
1b360 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 28 69 54  erm;.    if( (iT
1b370 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
1b380 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
1b390 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
1b3a0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
1b3b0 20 20 20 69 6e 74 20 6a 20 3d 20 70 49 64 78 43     int j = pIdxC
1b3c0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
1b3d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72  ;.      if( iTer
1b3e0 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
1b3f0 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20        || j<0.   
1b400 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e      || j>=pWC->n
1b410 54 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70  Term.       || p
1b420 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
1b430 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  m]!=0.       || 
1b440 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
1b450 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
1b460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b470 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
1b480 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b490 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74  pParse,"%s.xBest
1b4a0 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f  Index malfunctio
1b4b0 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  n",pSrc->pTab->z
1b4c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Name);.        r
1b4d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b4e0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1b4f0 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72  ( iTerm==nConstr
1b500 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20  aint-1 );.      
1b510 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29  testcase( j==0 )
1b520 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b530 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  ( j==pWC->nTerm-
1b540 31 20 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  1 );.      pTerm
1b550 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
1b560 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
1b570 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  q |= pTerm->prer
1b580 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  eqRight;.      a
1b590 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65  ssert( iTerm<pNe
1b5a0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
1b5b0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1b5c0 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
1b5d0 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
1b5e0 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20  mxTerm ) mxTerm 
1b5f0 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 74  = iTerm;.      t
1b600 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1b610 31 35 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  15 );.      test
1b620 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20  case( iTerm==16 
1b630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65  );.      if( iTe
1b640 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
1b650 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
1b660 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
1b670 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
1b680 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1b690 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1b6a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1b6b0 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
1b6c0 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
1b6d0 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
1b6e0 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
1b6f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d         ** consum
1b700 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
1b710 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31  lause because (1
1b720 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49  ) the order of I
1b730 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20  N terms.        
1b740 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ** is not necess
1b750 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
1b760 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75   the order of ou
1b770 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20  tput terms and. 
1b780 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
1b790 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
1b7a0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
1b7b0 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
1b7c0 65 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  erge.        ** 
1b7d0 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
1b7e0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
1b7f0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
1b800 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64  = 0;.        pId
1b810 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1b820 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58  &= ~SQLITE_INDEX
1b830 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20  _SCAN_UNIQUE;.  
1b840 20 20 20 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b        *pbIn = 1;
1b850 20 61 73 73 65 72 74 28 20 28 6d 45 78 63 6c 75   assert( (mExclu
1b860 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  de & WO_IN)==0 )
1b870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b880 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74    }.  pNew->u.vt
1b890 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d 20 7e  ab.omitMask &= ~
1b8a0 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e 65 77  mNoOmit;..  pNew
1b8b0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72  ->nLTerm = mxTer
1b8c0 6d 2b 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  m+1;.  assert( p
1b8d0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
1b8e0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 70  w->nLSlot );.  p
1b8f0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  New->u.vtab.idxN
1b900 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  um = pIdxInfo->i
1b910 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75  dxNum;.  pNew->u
1b920 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1b930 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1b940 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 70  oFreeIdxStr;.  p
1b950 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1b960 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
1b970 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1b980 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
1b990 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77 2d  >idxStr;.  pNew-
1b9a0 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
1b9b0 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66  d = (i8)(pIdxInf
1b9c0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
1b9d0 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78 49  ed ?.      pIdxI
1b9e0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20  nfo->nOrderBy : 
1b9f0 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  0);.  pNew->rSet
1ba00 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
1ba10 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
1ba20 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  gEstFromDouble(p
1ba30 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1ba40 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77 2d  edCost);.  pNew-
1ba50 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
1ba60 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e  ogEst(pIdxInfo->
1ba70 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
1ba80 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57 48  .  /* Set the WH
1ba90 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67 20  ERE_ONEROW flag 
1baa0 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  if the xBestInde
1bab0 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69 63  x() method indic
1bac0 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  ated.  ** that t
1bad0 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  he scan will vis
1bae0 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72  it at most one r
1baf0 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74 68  ow. Clear it oth
1bb00 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66 28  erwise. */.  if(
1bb10 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c   pIdxInfo->idxFl
1bb20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44  ags & SQLITE_IND
1bb30 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29  EX_SCAN_UNIQUE )
1bb40 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  {.    pNew->wsFl
1bb50 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
1bb60 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROW;.  }else{.  
1bb70 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1bb80 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f 57  &= ~WHERE_ONEROW
1bb90 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65  ;.  }.  rc = whe
1bba0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1bbb0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1bbc0 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
1bbd0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
1bbe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1bbf0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
1bc00 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  r);.    pNew->u.
1bc10 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1bc20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52  0;.  }.  WHERETR
1bc30 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 20 20  ACE(0xffff, ("  
1bc40 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49 6e 3d  bIn=%d prereqIn=
1bc50 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f 75 74  %04llx prereqOut
1bc60 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20  =%04llx\n",.    
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74 65    *pbIn, (sqlite
1bc90 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72 65 71  3_uint64)mPrereq
1bca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bcb0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1bcc0 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e 70  _uint64)(pNew->p
1bcd0 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71  rereq & ~mPrereq
1bce0 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1bcf0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  c;.}.../*.** Add
1bd00 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
1bd10 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
1bd20 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
1bd30 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
1bd40 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
1bd50 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
1bd60 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
1bd70 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
1bd80 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
1bd90 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46  there are no LEF
1bda0 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20  T or CROSS JOIN 
1bdb0 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65  joins in the que
1bdc0 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65 71  ry, both mPrereq
1bdd0 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c   and.** mUnusabl
1bde0 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20  e are set to 0. 
1bdf0 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65 72  Otherwise, mPrer
1be00 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20  eq is a mask of 
1be10 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  all FROM clause.
1be20 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ** entries that 
1be30 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
1be40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1be50 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1be60 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70  e and are.** sep
1be70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62  arated from it b
1be80 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c  y at least one L
1be90 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1bea0 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68  N. Similarly, th
1beb0 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d  e.** mUnusable m
1bec0 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ask contains all
1bed0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
1bee0 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
1bef0 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72  after the.** vir
1bf00 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61  tual table and a
1bf10 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  re separated fro
1bf20 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
1bf30 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a   one LEFT or .**
1bf40 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a   CROSS JOIN. .**
1bf50 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1bf60 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65   if the query we
1bf70 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  re:.**.**   ... 
1bf80 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54  FROM t1, t2 LEFT
1bf90 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74   JOIN t3, t4, vt
1bfa0 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20   CROSS JOIN t5, 
1bfb0 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d  t6;.**.** then m
1bfc0 50 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f 6e  Prereq correspon
1bfd0 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61  ds to (t1, t2) a
1bfe0 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20  nd mUnusable to 
1bff0 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20  (t5, t6)..**.** 
1c000 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69  All the tables i
1c010 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20 62  n mPrereq must b
1c020 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1c030 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1c040 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20  tual .** table. 
1c050 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  So any terms for
1c060 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65   which all prere
1c070 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74  quisites are sat
1c080 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 50  isfied by .** mP
1c090 72 65 72 65 71 20 6d 61 79 20 62 65 20 73 70 65  rereq may be spe
1c0a0 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c  cified as "usabl
1c0b0 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20  e" in all calls 
1c0c0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a  to xBestIndex. .
1c0d0 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61  ** Conversely, a
1c0e0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e  ll tables in mUn
1c0f0 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73  usable must be s
1c100 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65  canned after the
1c110 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74   current.** virt
1c120 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e  ual table, so an
1c130 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1c140 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69  h the prerequisi
1c150 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68  tes overlap with
1c160 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68  .** mUnusable sh
1c170 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63  ould always be c
1c180 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f  onfigured as "no
1c190 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42  t-usable" for xB
1c1a0 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  estIndex..*/.sta
1c1b0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1c1c0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
1c1d0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1c1e0 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
1c1f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
1c200 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
1c210 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20  mask mPrereq,   
1c220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1c230 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1c240 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1c250 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69  this one */.  Bi
1c260 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1c270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1c280 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1c290 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20  e scanned after 
1c2a0 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20  this one */.){. 
1c2b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c2c0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1c2d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c2e0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1c2f0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
1c300 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
1c310 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
1c320 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1c330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c340 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1c350 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1c360 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
1c370 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1c380 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1c390 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c3a0 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
1c3b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1c3c0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1c3d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1c3e0 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a  nfo *p;       /*
1c3f0 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20   Object to pass 
1c400 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1c410 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  */.  int nConstr
1c420 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
1c430 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1c440 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20  onstraints in p 
1c450 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20  */.  int bIn;   
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61    /* True if pla
1c480 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f  n uses IN(...) o
1c490 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65  perator */.  Whe
1c4a0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1c4b0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20  Bitmask mBest;  
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4d0 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62  Tables used by b
1c4e0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61  est possible pla
1c4f0 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  n */.  u16 mNoOm
1c500 69 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  it;..  assert( (
1c510 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73 61  mPrereq & mUnusa
1c520 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49  ble)==0 );.  pWI
1c530 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1c540 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
1c550 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1c560 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  e;.  pWC = pBuil
1c570 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77  der->pWC;.  pNew
1c580 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
1c590 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49  w;.  pSrc = &pWI
1c5a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1c5b0 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20  [pNew->iTab];.  
1c5c0 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
1c5d0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
1c5e0 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49  .  p = allocateI
1c5f0 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
1c600 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c   pWC, mUnusable,
1c610 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d   pSrc, pBuilder-
1c620 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
1c630 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69    &mNoOmit);.  i
1c640 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1c650 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1c660 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  PT;.  pNew->rSet
1c670 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  up = 0;.  pNew->
1c680 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1c690 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
1c6a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
1c6b0 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1c6c0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1c6d0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1c6e0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
1c6f0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
1c700 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  size(pParse->db,
1c710 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69   pNew, nConstrai
1c720 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nt) ){.    sqlit
1c730 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1c740 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74  >db, p);.    ret
1c750 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1c760 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1c770 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73   First call xBes
1c780 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c  tIndex() with al
1c790 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73  l constraints us
1c7a0 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45  able. */.  WHERE
1c7b0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1c7c0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1c7d0 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72  usable\n"));.  r
1c7e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1c7f0 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c  VirtualOne(pBuil
1c800 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c  der, mPrereq, AL
1c810 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f  LBITS, 0, p, mNo
1c820 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20  Omit, &bIn);..  
1c830 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  /* If the call t
1c840 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77  o xBestIndex() w
1c850 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e  ith all terms en
1c860 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61  abled produced a
1c870 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20   plan.  ** that 
1c880 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1c890 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c   any source tabl
1c8a0 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20  es (IOW: a plan 
1c8b0 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a  with mBest==0),.
1c8c0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
1c8d0 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d  is no point in m
1c8e0 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65  aking any furthe
1c8f0 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  r calls to xBest
1c900 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69  Index() .  ** si
1c910 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  nce they will al
1c920 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  l return the sam
1c930 65 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65  e result (if the
1c940 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20   xBestIndex().  
1c950 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1c960 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20  n is sane). */. 
1c970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c980 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28  OK && (mBest = (
1c990 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1c9a0 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a  mPrereq))!=0 ){.
1c9b0 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f      int seenZero
1c9c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c9d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
1c9e0 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72  lan with no prer
1c9f0 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  eqs seen */.    
1ca00 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  int seenZeroNoIN
1ca10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1ca20 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72   Plan with no pr
1ca30 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28  ereqs and no IN(
1ca40 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ...) seen */.   
1ca50 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d   Bitmask mPrev =
1ca60 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   0;.    Bitmask 
1ca70 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a  mBestNoIn = 0;..
1ca80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c      /* If the pl
1ca90 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74  an produced by t
1caa0 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  he earlier call 
1cab0 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  uses an IN(...) 
1cac0 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a  term, call.    *
1cad0 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61  * xBestIndex aga
1cae0 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69  in, this time wi
1caf0 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73  th IN(...) terms
1cb00 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
1cb10 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20    if( bIn ){.   
1cb20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1cb30 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1cb40 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77  ne: all usable w
1cb50 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20  /o IN\n"));.    
1cb60 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1cb70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1cb80 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1cb90 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42  r, mPrereq, ALLB
1cba0 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d  ITS, WO_IN, p, m
1cbb0 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20  NoOmit, &bIn);. 
1cbc0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e       assert( bIn
1cbd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65  ==0 );.      mBe
1cbe0 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70  stNoIn = pNew->p
1cbf0 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71  rereq & ~mPrereq
1cc00 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73  ;.      if( mBes
1cc10 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  tNoIn==0 ){.    
1cc20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31      seenZero = 1
1cc30 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65  ;.        seenZe
1cc40 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1cc50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1cc60 2a 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65  * Call xBestInde
1cc70 78 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  x once for each 
1cc80 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f  distinct value o
1cc90 66 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26  f (prereqRight &
1cca0 20 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20   ~mPrereq) .    
1ccb0 2a 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66  ** in the set of
1ccc0 20 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c   terms that appl
1ccd0 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
1cce0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
1ccf0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72   */.    while( r
1cd00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cd10 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1cd20 20 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74     Bitmask mNext
1cd30 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20   = ALLBITS;.    
1cd40 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e    assert( mNext>
1cd50 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
1cd60 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1cd70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
1cd80 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d   Bitmask mThis =
1cd90 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   (.            p
1cda0 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72  WC->a[p->aConstr
1cdb0 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
1cdc0 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74  set].prereqRight
1cdd0 20 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20   & ~mPrereq.    
1cde0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1cdf0 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26  f( mThis>mPrev &
1ce00 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20  & mThis<mNext ) 
1ce10 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20  mNext = mThis;. 
1ce20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72       }.      mPr
1ce30 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20  ev = mNext;.    
1ce40 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c    if( mNext==ALL
1ce50 42 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20  BITS ) break;.  
1ce60 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d      if( mNext==m
1ce70 42 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d  Best || mNext==m
1ce80 42 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69  BestNoIn ) conti
1ce90 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45  nue;.      WHERE
1cea0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1ceb0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65  VirtualOne: mPre
1cec0 76 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25  v=%04llx mNext=%
1ced0 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  04llx\n",.      
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
1cf00 29 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33  )mPrev, (sqlite3
1cf10 5f 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b  _uint64)mNext));
1cf20 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1cf30 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1cf40 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1cf50 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1cf60 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20   mNext|mPrereq, 
1cf70 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  0, p, mNoOmit, &
1cf80 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bIn);.      if( 
1cf90 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50  pNew->prereq==mP
1cfa0 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20  rereq ){.       
1cfb0 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20   seenZero = 1;. 
1cfc0 20 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d         if( bIn==
1cfd0 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  0 ) seenZeroNoIN
1cfe0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1cff0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1d000 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  he calls to xBes
1d010 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20  tIndex() in the 
1d020 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e  above loop did n
1d030 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20  ot find a plan. 
1d040 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69     ** that requi
1d050 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61  res no source ta
1d060 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65  bles at all (i.e
1d070 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64  . one guaranteed
1d080 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73   to be.    ** us
1d090 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61  able), make a ca
1d0a0 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c  ll here with all
1d0b0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64   source tables d
1d0c0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69  isabled */.    i
1d0d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d0e0 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20   && seenZero==0 
1d0f0 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1d100 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1d110 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69  rtualOne: all di
1d120 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20  sabled\n"));.   
1d130 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1d140 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1d150 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1d160 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72  er, mPrereq, mPr
1d170 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  ereq, 0, p, mNoO
1d180 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  mit, &bIn);.    
1d190 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73    if( bIn==0 ) s
1d1a0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1d1b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1d1c0 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78  f the calls to x
1d1d0 42 65 73 74 49 6e 64 65 78 28 29 20 68 61 76 65  BestIndex() have
1d1e0 20 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74   so far failed t
1d1f0 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20  o find a plan.  
1d200 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72    ** that requir
1d210 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62  es no source tab
1d220 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64  les at all and d
1d230 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49  oes not use an I
1d240 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70  N(...).    ** op
1d250 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66  erator, make a f
1d260 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74  inal call to obt
1d270 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a  ain one here.  *
1d280 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1d290 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a  LITE_OK && seenZ
1d2a0 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20  eroNoIN==0 ){.  
1d2b0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1d2c0 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1d2d0 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65  One: all disable
1d2e0 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29  d and w/o IN\n")
1d2f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1d300 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1d310 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20  lOne(.          
1d320 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1d330 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49  q, mPrereq, WO_I
1d340 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26  N, p, mNoOmit, &
1d350 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bIn);.    }.  }.
1d360 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f  .  if( p->needTo
1d370 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
1d380 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78  ite3_free(p->idx
1d390 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
1d3a0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1d3b0 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , p);.  return r
1d3c0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
1d3d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1d3e0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
1d3f0 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
1d400 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
1d410 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
1d420 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
1d430 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
1d440 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
1d450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1d460 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20  ereLoopAddOr(.  
1d470 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1d480 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42   *pBuilder, .  B
1d490 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20  itmask mPrereq, 
1d4a0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
1d4b0 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49  able.){.  WhereI
1d4c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
1d4d0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1d4e0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1d4f0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
1d500 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
1d510 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
1d520 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
1d530 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1d540 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
1d550 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
1d560 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
1d570 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
1d580 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
1d590 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  r;.  struct SrcL
1d5a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1d5b0 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
1d5c0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43  lder->pWC;.  pWC
1d5d0 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
1d5e0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65  WC->nTerm;.  pNe
1d5f0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1d600 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ew;.  memset(&sS
1d610 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  um, 0, sizeof(sS
1d620 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  um));.  pItem = 
1d630 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d640 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
1d650 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
1d660 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f  ->iCursor;..  fo
1d670 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
1d680 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
1d690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
1d6a0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
1d6b0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1d6c0 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
1d6d0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
1d6e0 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
1d6f0 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
1d700 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
1d710 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
1d720 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
1d730 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
1d740 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1d750 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
1d760 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
1d770 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
1d780 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
1d790 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
1d7a0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
1d7b0 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
1d7c0 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73   j;.    .      s
1d7d0 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
1d7e0 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
1d7f0 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
1d800 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
1d810 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
1d820 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45  ur;..      WHERE
1d830 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42  TRACE(0x200, ("B
1d840 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  egin processing 
1d850 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1d860 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20   pTerm));.      
1d870 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
1d880 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
1d890 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
1d8a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1d8b0 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
1d8c0 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
1d8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1d8e0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
1d8f0 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
1d900 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
1d910 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
1d920 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1d930 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
1d940 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
1d950 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
1d960 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1d970 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
1d980 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
1d990 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
1d9a0 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
1d9b0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
1d9c0 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
1d9d0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
1d9e0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1d9f0 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
1da00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1da10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1da20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
1da30 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  r.n = 0;.#ifdef 
1da40 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
1da50 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ED.        WHERE
1da60 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f  TRACE(0x200, ("O
1da70 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20  R-term %d of %p 
1da80 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a  has %d subterms:
1da90 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1daa0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
1dab0 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29  OrTerm-pOrWC->a)
1dac0 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69  , pTerm, sSubBui
1dad0 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b  ld.pWC->nTerm));
1dae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1daf0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
1db00 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
1db10 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1db20 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53 75 62  ClausePrint(sSub
1db30 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20  Build.pWC);.    
1db40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1db50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1db60 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1db70 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
1db80 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
1db90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1dba0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1dbb0 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
1dbc0 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  d, mPrereq, mUnu
1dbd0 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  sable);.        
1dbe0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1dbf0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1dc00 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1dc10 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
1dc20 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20  ld, mPrereq);.  
1dc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dc40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dc50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1dc60 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1dc70 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1dc80 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
1dc90 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1dca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1dcb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
1dcc0 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
1dcd0 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
1dce0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1dcf0 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
1dd00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dd10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
1dd20 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
1dd30 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
1dd40 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
1dd50 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1dd60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1dd70 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
1dd80 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
1dd90 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
1dda0 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
1ddb0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
1ddc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ddd0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
1dde0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
1ddf0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1de00 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
1de20 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
1de30 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
1de40 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
1de50 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
1de80 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
1de90 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
1dea0 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1ded0 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
1dee0 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
1def0 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
1df00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1df10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1df20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
1df30 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
1df40 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
1df50 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1df60 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1df70 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
1df80 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1df90 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
1dfa0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
1dfb0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1dfc0 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
1dfd0 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
1dfe0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
1dff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1e000 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
1e010 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
1e020 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
1e030 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
1e040 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
1e050 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
1e060 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
1e070 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
1e080 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
1e090 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
1e0a0 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
1e0b0 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
1e0c0 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
1e0d0 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
1e0e0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
1e0f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
1e100 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
1e110 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
1e120 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
1e130 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
1e140 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
1e150 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
1e160 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
1e170 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
1e180 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
1e190 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
1e1a0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1e1b0 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
1e1c0 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
1e1d0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
1e1e0 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
1e1f0 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
1e200 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1e210 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
1e220 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
1e230 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
1e240 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1e250 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
1e260 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
1e270 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
1e280 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
1e290 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
1e2a0 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
1e2b0 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
1e2c0 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
1e2d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1e2e0 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
1e2f0 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
1e300 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
1e310 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
1e320 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
1e330 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
1e340 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
1e350 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1e360 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1e370 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
1e380 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1e390 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65  200, ("End proce
1e3a0 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
1e3b0 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
1e3c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e3d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e3e0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1e3f0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
1e400 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
1e410 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1e420 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
1e430 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1e440 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
1e450 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
1e460 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
1e470 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d  itmask mPrereq =
1e480 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
1e490 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
1e4a0 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
1e4b0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
1e4c0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
1e4d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e4e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74  tem *pItem;.  st
1e4f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e500 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c  m *pEnd = &pTabL
1e510 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  ist->a[pWInfo->n
1e520 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65  Level];.  sqlite
1e530 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
1e540 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
1e550 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e560 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1e570 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  New;.  u8 priorJ
1e580 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20  ointype = 0;..  
1e590 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
1e5a0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
1e5b0 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
1e5c0 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
1e5d0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1e5e0 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  ew;.  whereLoopI
1e5f0 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72  nit(pNew);.  for
1e600 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70  (iTab=0, pItem=p
1e610 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65  TabList->a; pIte
1e620 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20  m<pEnd; iTab++, 
1e630 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69  pItem++){.    Bi
1e640 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1e650 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
1e660 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
1e670 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
1e680 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
1e690 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
1e6a0 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
1e6b0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
1e6c0 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   ((pItem->fg.joi
1e6d0 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74  ntype|priorJoint
1e6e0 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c  ype) & (JT_LEFT|
1e6f0 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b  JT_CROSS))!=0 ){
1e700 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
1e710 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
1e720 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74   when pItem is t
1e730 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1e740 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  erm on the.     
1e750 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73   ** right-hand-s
1e760 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72  ide of a LEFT or
1e770 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f   CROSS JOIN.  */
1e780 0a 20 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d  .      mPrereq =
1e790 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
1e7a0 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65     priorJointype
1e7b0 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   = pItem->fg.joi
1e7c0 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53  ntype;.#ifndef S
1e7d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1e7e0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
1e7f0 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
1e800 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1e810 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e820 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  tem *p;.      fo
1e830 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70  r(p=&pItem[1]; p
1e840 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20  <pEnd; p++){.   
1e850 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62       if( mUnusab
1e860 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69  le || (p->fg.joi
1e870 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
1e880 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20  |JT_CROSS)) ){. 
1e890 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62           mUnusab
1e8a0 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  le |= sqlite3Whe
1e8b0 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
1e8c0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  o->sMaskSet, p->
1e8d0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1e8e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e8f0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1e900 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
1e910 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  der, mPrereq, mU
1e920 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65  nusable);.    }e
1e930 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1e940 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1e950 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a  LTABLE */.    {.
1e960 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e970 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
1e980 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b  ilder, mPrereq);
1e990 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e9a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e9b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e9c0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
1e9d0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  er, mPrereq, mUn
1e9e0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  usable);.    }. 
1e9f0 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65     mPrior |= pNe
1ea00 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
1ea10 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d   if( rc || db->m
1ea20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
1ea30 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72  eak;.  }..  wher
1ea40 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
1ea50 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
1ea60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
1ea70 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
1ea80 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
1ea90 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
1eaa0 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
1eab0 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
1eac0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
1ead0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
1eae0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
1eaf0 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
1eb00 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
1eb10 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
1eb20 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
1eb30 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
1eb40 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
1eb50 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
1eb60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1eb70 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
1eb80 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
1eb90 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1eba0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
1ebb0 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
1ebc0 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
1ebd0 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
1ebe0 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
1ebf0 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
1ec00 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
1ec10 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
1ec20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
1ec30 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
1ec40 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
1ec50 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
1ec60 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
1ec70 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
1ec80 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
1ec90 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
1eca0 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
1ecb0 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
1ecc0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
1ecd0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
1ece0 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
1ecf0 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
1ed00 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
1ed10 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
1ed20 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
1ed30 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
1ed40 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
1ed50 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
1ed60 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
1ed70 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
1ed80 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
1ed90 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
1eda0 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
1edb0 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
1edc0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
1edd0 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
1ede0 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
1edf0 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
1ee00 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
1ee10 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
1ee20 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
1ee30 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
1ee40 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1ee50 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1ee60 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
1ee70 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
1ee80 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
1ee90 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
1eea0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1eeb0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
1eec0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
1eed0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
1eee0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
1eef0 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42   /* WHERE_GROUPB
1ef00 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59  Y or _DISTINCTBY
1ef10 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d   or _ORDERBY_LIM
1ef20 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  IT */.  u16 nLoo
1ef30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1ef40 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1ef50 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
1ef60 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
1ef70 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
1ef80 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
1ef90 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
1efa0 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
1efb0 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
1efc0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
1efd0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
1efe0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
1eff0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
1f000 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
1f010 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
1f020 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
1f030 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
1f040 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
1f050 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
1f060 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
1f070 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
1f080 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
1f090 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1f0a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1f0b0 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
1f0c0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
1f0d0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
1f0e0 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
1f0f0 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
1f100 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
1f110 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
1f120 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
1f130 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
1f140 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
1f150 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
1f160 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1f170 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65  lause */.  u16 e
1f180 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  qOpMask;        
1f190 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61   /* Allowed equa
1f1a0 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
1f1b0 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
1f1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f1d0 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
1f1e0 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
1f1f0 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
1f200 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1f210 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
1f220 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
1f230 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
1f240 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
1f250 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
1f260 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1f270 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1f280 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
1f290 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f2a0 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
1f2b0 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
1f2c0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
1f2d0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
1f2e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1f2f0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
1f300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1f310 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1f320 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
1f330 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
1f340 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
1f350 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
1f360 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
1f370 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
1f380 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
1f390 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
1f3a0 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
1f3b0 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
1f3c0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
1f3d0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
1f3e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1f3f0 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
1f400 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
1f410 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
1f420 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
1f430 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
1f440 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
1f450 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
1f460 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
1f470 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1f480 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
1f490 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
1f4a0 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
1f4b0 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
1f4c0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
1f4d0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
1f4e0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
1f4f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1f500 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
1f510 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
1f520 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
1f530 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
1f540 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
1f550 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
1f560 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
1f570 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1f580 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
1f590 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
1f5a0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
1f5b0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
1f5c0 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
1f5d0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
1f5e0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
1f5f0 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
1f600 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
1f610 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
1f620 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
1f630 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
1f640 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
1f650 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
1f660 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
1f670 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
1f680 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1f690 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
1f6a0 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
1f6b0 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
1f6c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1f6d0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
1f6e0 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
1f6f0 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
1f700 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
1f710 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
1f720 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
1f730 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
1f740 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
1f750 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
1f760 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
1f770 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
1f780 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
1f790 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
1f7a0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
1f7b0 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
1f7c0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
1f7d0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
1f7e0 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
1f7f0 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
1f800 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
1f810 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
1f820 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
1f830 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
1f840 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
1f850 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
1f860 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
1f870 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
1f880 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
1f890 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
1f8a0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1f8b0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
1f8c0 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
1f8d0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
1f8e0 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
1f8f0 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
1f900 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
1f910 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
1f920 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
1f930 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
1f940 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
1f950 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
1f960 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
1f970 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
1f980 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
1f990 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
1f9a0 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
1f9b0 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
1f9c0 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
1f9d0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
1f9e0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
1f9f0 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
1fa00 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
1fa10 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
1fa20 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
1fa30 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
1fa40 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
1fa50 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1fa60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
1fa70 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
1fa80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
1fa90 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
1faa0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1fab0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1fac0 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
1fad0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1fae0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
1faf0 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
1fb00 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
1fb10 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
1fb20 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
1fb30 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
1fb40 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
1fb50 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
1fb60 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
1fb70 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
1fb80 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
1fb90 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
1fba0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
1fbb0 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
1fbc0 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
1fbd0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
1fbe0 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
1fbf0 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20  0;.  eqOpMask = 
1fc00 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20  WO_EQ | WO_IS | 
1fc10 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28  WO_ISNULL;.  if(
1fc20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
1fc30 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
1fc40 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20  T ) eqOpMask |= 
1fc50 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f  WO_IN;.  for(iLo
1fc60 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
1fc70 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
1fc80 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
1fc90 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
1fca0 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
1fcb0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
1fcc0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
1fcd0 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70   if( iLoop<nLoop
1fce0 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20   ){.      pLoop 
1fcf0 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
1fd00 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28  Loop];.      if(
1fd10 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
1fd20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
1fd30 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
1fd40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1fd50 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Loop = pLast;.  
1fd60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
1fd70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1fd80 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
1fd90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
1fda0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
1fdb0 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
1fdc0 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
1fdd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43  ak;.    }.    iC
1fde0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
1fdf0 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
1fe00 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a  iTab].iCursor;..
1fe10 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
1fe20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72  any ORDER BY ter
1fe30 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f  m X that is a co
1fe40 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
1fe50 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
1fe60 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  current loop for
1fe70 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
1fe80 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
1fe90 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  E.    ** clause 
1fea0 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53  of the form X IS
1feb0 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61   NULL or X=? tha
1fec0 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  t reference only
1fed0 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f   outer.    ** lo
1fee0 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ops..    */.    
1fef0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
1ff00 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
1ff10 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1ff20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1ff30 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70  ue;.      pOBExp
1ff40 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1ff50 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
1ff60 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1ff70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
1ff80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1ff90 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
1ffa0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1ffb0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
1ffc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1ffd0 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
1ffe0 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70  WhereFindTerm(&p
1fff0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72  WInfo->sWC, iCur
20000 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  , pOBExpr->iColu
20010 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
20020 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64             ~read
20030 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b  y, eqOpMask, 0);
20040 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
20050 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
20060 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
20070 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
20080 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  N ){.        /* 
20090 49 4e 20 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c  IN terms are onl
200a0 79 20 76 61 6c 69 64 20 66 6f 72 20 73 6f 72 74  y valid for sort
200b0 69 6e 67 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ing in the ORDER
200c0 20 42 59 20 4c 49 4d 49 54 20 0a 20 20 20 20 20   BY LIMIT .     
200d0 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69     ** optimizati
200e0 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c  on, and then onl
200f0 79 20 69 66 20 74 68 65 79 20 61 72 65 20 61 63  y if they are ac
20100 74 75 61 6c 6c 79 20 75 73 65 64 0a 20 20 20 20  tually used.    
20110 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 71 75      ** by the qu
20120 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20  ery plan */.    
20130 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72      assert( wctr
20140 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
20150 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a  RDERBY_LIMIT );.
20160 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
20170 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   j<pLoop->nLTerm
20180 20 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70   && pTerm!=pLoop
20190 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b  ->aLTerm[j]; j++
201a0 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
201b0 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d  j>=pLoop->nLTerm
201c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
201d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
201e0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
201f0 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21  &(WO_EQ|WO_IS))!
20200 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
20210 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
20220 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20230 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
20240 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
20250 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
20260 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
20270 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
20280 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
20290 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
202a0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
202b0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
202c0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
202d0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
202e0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
202f0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
20300 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
20310 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
20320 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
20330 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
20340 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
20350 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
20360 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
20370 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
20380 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
20390 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
203a0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
203b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
203c0 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
203d0 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  T(i);.    }..   
203e0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
203f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
20400 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
20410 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
20420 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
20430 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
20440 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
20450 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  KeyCol = 0;.    
20460 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b      nColumn = 1;
20470 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20480 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
20490 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
204a0 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
204b0 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
204c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
204d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
204e0 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70       nKeyCol = p
204f0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  Index->nKeyCol;.
20500 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
20510 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
20520 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
20530 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79  t( nColumn==nKey
20540 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77  Col+1 || !HasRow
20550 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
20560 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  e) );.        as
20570 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69  sert( pIndex->ai
20580 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31  Column[nColumn-1
20590 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20  ]==XN_ROWID.    
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77        || !HasRow
205c0 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
205d0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  e));.        isO
205e0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49  rderDistinct = I
205f0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
20600 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
20610 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
20620 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  ough all columns
20630 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
20640 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  d deal with the 
20650 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ones.      ** th
20660 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
20670 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20  rained by == or 
20680 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
20690 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20     rev = revSet 
206a0 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69  = 0;.      disti
206b0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  nctColumns = 0;.
206c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
206d0 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  <nColumn; j++){.
206e0 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
206f0 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65 20 74 6f   = 1; /* True to
20700 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42   run the ORDER B
20710 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f  Y search loop */
20720 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
20730 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ( j>=pLoop->u.bt
20740 72 65 65 2e 6e 45 71 20 0a 20 20 20 20 20 20 20  ree.nEq .       
20750 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e       || (pLoop->
20760 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28  aLTerm[j]==0)==(
20770 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a  j<pLoop->nSkip).
20780 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20790 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e     if( j<pLoop->
207a0 75 2e 62 74 72 65 65 2e 6e 45 71 20 26 26 20 6a  u.btree.nEq && j
207b0 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29  >=pLoop->nSkip )
207c0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20  {.          u16 
207d0 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  eOp = pLoop->aLT
207e0 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[j]->eOperato
207f0 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  r;..          /*
20800 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e   Skip over == an
20810 64 20 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20  d IS and ISNULL 
20820 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f 20 73 6b  terms.  (Also sk
20830 69 70 20 49 4e 20 74 65 72 6d 73 20 77 68 65 6e  ip IN terms when
20840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  .          ** do
20850 69 6e 67 20 57 48 45 52 45 5f 4f 52 44 45 52 42  ing WHERE_ORDERB
20860 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65 73 73 69  Y_LIMIT processi
20870 6e 67 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20  ng). .          
20880 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
20890 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  If the current t
208a0 65 72 6d 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  erm is a column 
208b0 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20 49 4e 20  of an ((?,?) IN 
208c0 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20 0a 20 20  (SELECT...)) .  
208d0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
208e0 73 73 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20  ssion for which 
208f0 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
20900 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
20910 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20   column,.       
20920 20 20 20 2a 2a 20 63 68 65 63 6b 20 74 68 61 74     ** check that
20930 20 69 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20   it is the only 
20940 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62 79 20 74  column used by t
20950 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68 65 72 77  his loop. Otherw
20960 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  ise,.          *
20970 2a 20 69 66 20 69 74 20 69 73 20 6f 6e 65 20 6f  * if it is one o
20980 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e  f two or more, n
20990 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  one of the colum
209a0 6e 73 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  ns can be.      
209b0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
209c0 64 20 74 6f 20 6d 61 74 63 68 20 61 6e 20 4f 52  d to match an OR
209d0 44 45 52 20 42 59 20 74 65 72 6d 2e 20 20 2a 2f  DER BY term.  */
209e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
209f0 65 4f 70 20 26 20 65 71 4f 70 4d 61 73 6b 29 21  eOp & eqOpMask)!
20a00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
20a10 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
20a20 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
20a30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20a40 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
20a50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20a60 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
20a70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
20a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20a90 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
20aa0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
20ab0 20 41 4c 57 41 59 53 28 65 4f 70 20 26 20 57 4f   ALWAYS(eOp & WO
20ac0 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _IN) ){.        
20ad0 20 20 20 20 2f 2a 20 41 4c 57 41 59 53 28 29 20      /* ALWAYS() 
20ae0 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 3a 20 65  justification: e
20af0 4f 70 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74  Op is an equalit
20b00 79 20 6f 70 65 72 61 74 6f 72 20 64 75 65 20 74  y operator due t
20b10 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
20b20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e    ** j<pLoop->u.
20b30 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e 73 74 72  btree.nEq constr
20b40 61 69 6e 74 20 61 62 6f 76 65 2e 20 20 41 6e 79  aint above.  Any
20b50 20 65 71 75 61 6c 69 74 79 20 6f 74 68 65 72 0a   equality other.
20b60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
20b70 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20 63 61 70  han WO_IN is cap
20b80 74 75 72 65 64 20 62 79 20 74 68 65 20 70 72 65  tured by the pre
20b90 76 69 6f 75 73 20 22 69 66 22 2e 20 20 53 6f 20  vious "if".  So 
20ba0 74 68 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 20  this one.       
20bb0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 68       ** always h
20bc0 61 73 20 74 6f 20 62 65 20 57 4f 5f 49 4e 2e 20  as to be WO_IN. 
20bd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
20be0 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d  xpr *pX = pLoop-
20bf0 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70  >aLTerm[j]->pExp
20c00 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  r;.            f
20c10 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f  or(i=j+1; i<pLoo
20c20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
20c30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
20c40 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
20c50 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
20c60 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =pX ){.         
20c70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
20c80 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  pLoop->aLTerm[i]
20c90 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20ca0 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  _IN) );.        
20cb0 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
20cc0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
20cd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20d00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
20d10 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
20d20 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
20d30 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
20d40 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
20d50 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
20d60 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
20d70 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
20d80 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
20d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20da0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
20db0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
20dc0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20dd0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
20de0 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
20df0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
20e00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
20e10 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
20e20 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
20e30 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
20e40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20e50 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
20e60 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  XN_ROWID;.      
20e70 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
20e80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
20e90 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
20ea0 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
20eb0 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
20ec0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
20ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
20ee0 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
20ef0 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
20f00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
20f10 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
20f20 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
20f30 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
20f40 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
20f50 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
20f60 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
20f70 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
20f80 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
20f90 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
20fa0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
20fb0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
20fc0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
20fd0 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
20fe0 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
20ff0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
21000 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
21010 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
21020 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
21030 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
21040 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
21050 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
21060 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
21070 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
21080 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
21090 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
210a0 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
210b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
210c0 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
210d0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
210e0 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
210f0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
21100 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21110 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
21120 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
21130 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21140 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
21150 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
21160 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
21170 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
21180 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
21190 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
211a0 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
211b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
211c0 20 69 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29   iColumn>=(-1) )
211d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
211e0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
211f0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
21200 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
21210 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
21220 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
21230 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21240 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
21250 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
21260 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21270 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21280 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21290 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
212a0 28 70 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d  (pOBExpr,pIndex-
212b0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
212c0 70 45 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20  pExpr,iCur) ){. 
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
212e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
212f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
21300 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21310 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
21320 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
21330 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
21340 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
21350 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
21360 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
21370 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
21380 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
21390 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
213a0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
213b0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
213c0 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
213d0 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
213e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
213f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21400 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
21410 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21430 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28  if( isMatch && (
21440 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21450 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
21460 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
21470 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
21480 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61  t order is compa
21490 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45  tible in an ORDE
214a0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
214b0 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f         ** Sort o
214c0 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61  rder is irreleva
214d0 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42  nt for a GROUP B
214e0 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  Y clause. */.   
214f0 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65         if( revSe
21500 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
21510 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49   if( (rev ^ revI
21520 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61  dx)!=pOrderBy->a
21530 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
21540 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
21550 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21560 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20            rev = 
21570 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42  revIdx ^ pOrderB
21580 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
21590 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
215a0 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
215b0 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
215c0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
215d0 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20    revSet = 1;.  
215e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
215f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21600 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
21610 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
21620 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20  ==XN_ROWID ){.  
21630 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21640 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  se( distinctColu
21650 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mns==0 );.      
21660 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
21670 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  lumns = 1;.     
21680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21690 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
216a0 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  T(i);.        }e
216b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
216c0 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64  * No match found
216d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
216e0 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79  ( j==0 || j<nKey
216f0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
21700 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
21710 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20  rderDistinct!=0 
21720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
21730 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
21740 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
21750 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21770 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f   } /* end Loop o
21780 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f  ver all index co
21790 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69  lumns */.      i
217a0 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  f( distinctColum
217b0 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ns ){.        te
217c0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
217d0 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
217e0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
217f0 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20  tinct = 1;.     
21800 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d   }.    } /* end-
21810 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a  if not one-row *
21820 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  /..    /* Mark o
21830 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44  ff any other ORD
21840 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
21850 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70   reference pLoop
21860 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72   */.    if( isOr
21870 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
21880 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e       orderDistin
21890 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d  ctMask |= pLoop-
218a0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
218b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
218c0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
218d0 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
218e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65       Bitmask mTe
218f0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
21900 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
21910 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
21920 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65         p = pOrde
21930 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
21940 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d  .        mTerm =
21950 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
21960 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  rUsage(&pWInfo->
21970 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
21980 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
21990 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
219a0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
219b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
219c0 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
219d0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
219e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
219f0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
21a00 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
21a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21a20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
21a30 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
21a40 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
21a50 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
21a60 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
21a70 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
21a80 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
21a90 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
21aa0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
21ab0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
21ac0 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
21ad0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
21ae0 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
21af0 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
21b00 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
21b10 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
21b20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
21b30 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
21b40 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
21b50 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
21b60 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
21b70 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
21b80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21b90 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
21ba0 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
21bb0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
21bc0 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
21bd0 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
21be0 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
21bf0 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
21c00 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
21c10 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
21c20 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
21c30 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
21c40 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
21c50 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
21c60 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
21c70 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
21c80 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
21c90 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
21ca0 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
21cb0 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
21cc0 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
21cd0 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
21ce0 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
21cf0 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
21d00 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
21d10 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
21d20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
21d30 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
21d40 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
21d50 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
21d60 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
21d70 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
21d80 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
21d90 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
21da0 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
21db0 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
21dc0 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
21dd0 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
21de0 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
21df0 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
21e00 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
21e10 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
21e20 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
21e30 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
21e40 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
21e50 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
21e60 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
21e70 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
21e80 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
21e90 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
21ea0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
21eb0 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
21ec0 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
21ed0 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
21ee0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
21ef0 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
21f00 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
21f10 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
21f20 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21f30 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
21f40 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
21f50 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21f60 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
21f70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
21f80 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
21f90 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
21fa0 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
21fb0 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
21fc0 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
21fd0 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
21fe0 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
21ff0 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
22000 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
22010 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
22020 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
22030 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
22040 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
22050 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
22060 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
22070 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
22080 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
22090 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
220a0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
220b0 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
220c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
220d0 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
220e0 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72  f sorting nRow r
220f0 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ows, assuming th
22100 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65  at the keys have
22110 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f   .** nOrderby co
22120 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74  lumns and that t
22130 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64  he first nSorted
22140 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72   columns are alr
22150 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  eady in.** order
22160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
22170 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43  st whereSortingC
22180 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  ost(.  WhereInfo
22190 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45   *pWInfo,.  LogE
221a0 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e  st nRow,.  int n
221b0 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e  OrderBy,.  int n
221c0 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54  Sorted.){.  /* T
221d0 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
221e0 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
221f0 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77  external sort, w
22200 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20  here N is .  ** 
22210 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
22220 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
22230 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
22240 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
22250 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  (N))..  ** .  **
22260 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
22270 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
22280 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
22290 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a   the last Y .  *
222a0 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
222b0 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
222c0 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
222d0 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
222e0 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
222f0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
22300 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
22310 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
22320 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
22330 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d  (Y/X) term is im
22340 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
22350 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72  stack variable r
22360 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77  Scale.  ** below
22370 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  .  */.  LogEst r
22380 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
22390 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64  ;.  assert( nOrd
223a0 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
223b0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
223c0 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73   );.  rScale = s
223d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
223e0 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a  rderBy-nSorted)*
223f0 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20  100/nOrderBy) - 
22400 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20  66;.  rSortCost 
22410 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20  = nRow + rScale 
22420 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74  + 16;..  /* Mult
22430 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77  iple by log(M) w
22440 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75  here M is the nu
22450 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
22460 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68  ows..  ** Use th
22470 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66  e LIMIT for M if
22480 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a   it is smaller *
22490 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  /.  if( (pWInfo-
224a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
224b0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d  ERE_USE_LIMIT)!=
224c0 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  0 && pWInfo->iLi
224d0 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20  mit<nRow ){.    
224e0 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  nRow = pWInfo->i
224f0 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f  Limit;.  }.  rSo
22500 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67  rtCost += estLog
22510 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e  (nRow);.  return
22520 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f   rSortCost;.}../
22530 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c  *.** Given the l
22540 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
22550 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e   objects at pWIn
22560 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73  fo->pLoops, this
22570 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65   routine.** atte
22580 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65  mpts to find the
22590 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
225a0 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61  h that visits ea
225b0 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20  ch WhereLoop.** 
225c0 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68  once.  This path
225d0 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20   is then loaded 
225e0 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d  into the pWInfo-
225f0 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c  >a[].pWLoop fiel
22600 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65  ds..**.** Assume
22610 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20   that the total 
22620 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
22630 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
22640 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65  need to be sorte
22650 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f  d.** will be nRo
22660 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a  wEst (in the 10*
22670 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74  log2 representat
22680 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72  ion).  Or, ignor
22690 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73  e sorting.** cos
226a0 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30  ts if nRowEst==0
226b0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
226c0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
226d0 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
226e0 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
226f0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
22700 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
22710 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
22720 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
22730 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67  nfo *pWInfo, Log
22740 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  Est nRowEst){.  
22750 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
22760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
22770 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
22780 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
22790 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
227a0 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
227b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
227c0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
227d0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
227e0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
227f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
22800 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
22810 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
22820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22830 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22840 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
22850 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
22860 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22870 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
22880 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
22890 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
228c0 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20  .  int mxI = 0; 
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228e0 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e  Index of next en
228f0 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a  try to replace *
22900 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
22910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22920 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
22930 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
22940 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43   */.  LogEst mxC
22950 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
22960 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20  /* Maximum cost 
22970 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
22980 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
22990 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20  Unsorted = 0;   
229a0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f   /* Maximum unso
229b0 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73  rted cost of a s
229c0 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20  et of path */.  
229d0 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
229e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
229f0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
22a00 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
22a10 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
22a20 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
22a30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
22a40 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
22a50 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
22a60 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
22a70 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
22a80 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
22a90 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
22aa0 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
22ab0 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
22ac0 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
22ad0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
22ae0 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
22af0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
22b00 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
22b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22b20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
22b30 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
22b40 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
22b50 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
22b60 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
22b70 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
22b80 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
22b90 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20  eLoop **pX;     
22ba0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
22bb0 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70   divy up the pSp
22bc0 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ace memory */.  
22bd0 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73  LogEst *aSortCos
22be0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72  t = 0;    /* Sor
22bf0 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c  ting and partial
22c00 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a   sorting costs *
22c10 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
22c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22c30 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   Temporary memor
22c40 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72  y used by this r
22c50 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
22c60 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  nSpace;         
22c70 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
22c80 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
22c90 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a  d at pSpace */..
22ca0 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
22cb0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
22cc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22cd0 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
22ce0 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
22cf0 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
22d00 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
22d10 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
22d20 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
22d30 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
22d40 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
22d50 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
22d60 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
22d70 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
22d80 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
22d90 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
22da0 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c  Choice = (nLoop<
22db0 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
22dc0 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
22dd0 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
22de0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22df0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
22e00 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
22e10 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
22e20 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29  r.  (nRowEst=%d)
22e30 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
22e40 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74  .  /* If nRowEst
22e50 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
22e60 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
22e70 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65  Y clause, ignore
22e80 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a   it. In this.  *
22e90 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f  * case the purpo
22ea0 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  se of this call 
22eb0 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  is to estimate t
22ec0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
22ed0 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  s returned.  ** 
22ee0 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71  by the overall q
22ef0 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20  uery. Once this 
22f00 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65  estimate has bee
22f10 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20  n obtained, the 
22f20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c  caller.  ** will
22f30 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
22f40 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74  ction a second t
22f50 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65  ime, passing the
22f60 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65   estimate as the
22f70 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61  .  ** nRowEst pa
22f80 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69  rameter.  */.  i
22f90 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
22fa0 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
22fb0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64  t==0 ){.    nOrd
22fc0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
22fd0 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  e{.    nOrderBy 
22fe0 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
22ff0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a  By->nExpr;.  }..
23000 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
23010 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61  d initialize spa
23020 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f  ce for aTo, aFro
23030 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b  m and aSortCost[
23040 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20  ] */.  nSpace = 
23050 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
23060 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
23070 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
23080 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63  hoice*2;.  nSpac
23090 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  e += sizeof(LogE
230a0 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a  st) * nOrderBy;.
230b0 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
230c0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
230d0 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  db, nSpace);.  i
230e0 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
230f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23100 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d  EM_BKPT;.  aTo =
23110 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
23120 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
23130 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
23140 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
23150 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
23160 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
23170 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
23180 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
23190 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
231a0 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
231b0 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
231c0 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
231d0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
231e0 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72  X;.  }.  if( nOr
231f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20  derBy ){.    /* 
23200 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
23210 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
23220 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69  nd it is not bei
23230 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20  ng ignored, set 
23240 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  up.    ** space 
23250 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73  for the aSortCos
23260 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20  t[] array. Each 
23270 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
23280 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20  SortCost array. 
23290 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
232a0 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69  zero - meaning i
232b0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
232c0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d  en initialized -
232d0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   or the.    ** c
232e0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
232f0 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64  RowEst rows of d
23300 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66 69  ata where the fi
23310 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20  rst X terms of. 
23320 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20     ** the ORDER 
23330 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  BY clause are al
23340 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20  ready in order, 
23350 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20 61  where X is the a
23360 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64  rray .    ** ind
23370 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72  ex.  */.    aSor
23380 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  tCost = (LogEst*
23390 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  )pX;.    memset(
233a0 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69  aSortCost, 0, si
233b0 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
233c0 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20  OrderBy);.  }.  
233d0 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
233e0 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t==0 || &pSpace[
233f0 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
23400 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65  &aSortCost[nOrde
23410 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  rBy] );.  assert
23420 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c  ( aSortCost!=0 |
23430 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65  | &pSpace[nSpace
23440 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a  ]==(char*)pX );.
23450 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73  .  /* Seed the s
23460 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e  earch with a sin
23470 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f  gle WherePath co
23480 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68  ntaining zero Wh
23490 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20  ereLoops..  **. 
234a0 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e   ** TUNING: Do n
234b0 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65  ot let the numbe
234c0 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
234d0 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66  go above 28.  If
234e0 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f   the cost.  ** o
234f0 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61  f computing an a
23500 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
23510 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20  s not paid back 
23520 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
23530 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74   28.  ** rows, t
23540 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hen do not use t
23550 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
23560 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30  ex. */.  aFrom[0
23570 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61  ].nRow = MIN(pPa
23580 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c  rse->nQueryLoop,
23590 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20 34   48);  assert( 4
235a0 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  8==sqlite3LogEst
235b0 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20  (28) );.  nFrom 
235c0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 1;.  assert( a
235d0 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
235e0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f  d==0 );.  if( nO
235f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
23600 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72   If nLoop is zer
23610 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72  o, then there ar
23620 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20  e no FROM terms 
23630 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53 69  in the query. Si
23640 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  nce.    ** in th
23650 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65 72  is case the quer
23660 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d  y may return a m
23670 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f  aximum of one ro
23680 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  w, the results. 
23690 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64     ** are alread
236a0 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  y in the request
236b0 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73  ed order. Set is
236c0 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65  Ordered to nOrde
236d0 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e  rBy to.    ** in
236e0 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c  dicate this. Or,
236f0 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65   if nLoop is gre
23700 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
23710 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  set isOrdered to
23720 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69  .    ** -1, indi
23730 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
23740 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f  result set may o
23750 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64  r may not be ord
23760 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65  ered, .    ** de
23770 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c  pending on the l
23780 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74 68  oops added to th
23790 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20  e current plan. 
237a0 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d   */.    aFrom[0]
237b0 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f  .isOrdered = nLo
237c0 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64  op>0 ? -1 : nOrd
237d0 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  erBy;.  }..  /* 
237e0 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
237f0 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
23800 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
23810 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
23820 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
23830 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
23840 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
23850 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
23860 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
23870 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
23880 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
23890 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
238a0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
238b0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
238c0 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
238d0 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
238e0 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
238f0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
23900 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
23910 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
23920 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
23930 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
23940 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
23950 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
23960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
23970 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28 70  ws visited by (p
23980 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
23990 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
239a0 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
239b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
239c0 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d  t of path (pFrom
239d0 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
239e0 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f      LogEst rUnso
239f0 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
23a00 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65        /* Unsorte
23a10 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d  d cost of (pFrom
23a20 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
23a30 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64      i8 isOrdered
23a40 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
23a50 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72  red;  /* isOrder
23a60 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57  ed for (pFrom+pW
23a70 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
23a80 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
23a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23aa0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72     /* Mask of sr
23ab0 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e  c visited by (..
23ac0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
23ad0 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
23ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23af0 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72  * Mask of rev-or
23b00 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e  der loops for (.
23b10 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  .) */..        i
23b20 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72  f( (pWLoop->prer
23b30 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73  eq & ~pFrom->mas
23b40 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
23b50 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
23b60 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  ( (pWLoop->maskS
23b70 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73  elf & pFrom->mas
23b80 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
23b90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
23ba0 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ( (pWLoop->wsFla
23bb0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
23bc0 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 46 72  INDEX)!=0 && pFr
23bd0 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20  om->nRow<10 ){. 
23be0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
23bf0 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61  ot use an automa
23c00 74 69 63 20 69 6e 64 65 78 20 69 66 20 74 68 65  tic index if the
23c10 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78   this loop is ex
23c20 70 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 20  pected.         
23c30 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20   ** to run less 
23c40 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f  than 2 times. */
23c50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23c60 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
23c70 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20  gEst(2) );.     
23c80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
23c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23ca0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
23cb0 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
23cc0 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
23cd0 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
23ce0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
23cf0 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
23d00 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
23d10 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
23d20 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
23d30 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
23d40 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
23d50 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
23d60 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
23d70 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70  Add(rUnsorted, p
23d80 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29  From->rUnsorted)
23d90 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d  ;.        nOut =
23da0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
23db0 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
23dc0 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
23dd0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
23de0 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
23df0 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  f;.        if( i
23e00 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20  sOrdered<0 ){.  
23e10 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
23e20 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  d = wherePathSat
23e30 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
23e40 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
23e60 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
23e70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63  From, pWInfo->wc
23e80 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  trlFlags,.      
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20   iLoop, pWLoop, 
23eb0 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20  &revMask);.     
23ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23ed0 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
23ee0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
23ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23f00 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30  if( isOrdered>=0
23f10 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f   && isOrdered<nO
23f20 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
23f30 20 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73      if( aSortCos
23f40 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20  t[isOrdered]==0 
23f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
23f60 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
23f70 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69  ed] = whereSorti
23f80 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20  ngCost(.        
23f90 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20          pWInfo, 
23fa0 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42  nRowEst, nOrderB
23fb0 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  y, isOrdered.   
23fc0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
23fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23fe0 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
23ff0 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
24000 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b  rted, aSortCost[
24010 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20  isOrdered]);..  
24020 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
24030 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20  CE(0x002,.      
24040 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73          ("---- s
24050 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25  ort cost=%-3d (%
24060 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20  d/%d) increases 
24070 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64  cost %3d to %-3d
24080 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
24090 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
240a0 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65  Ordered], (nOrde
240b0 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20  rBy-isOrdered), 
240c0 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  nOrderBy, .     
240d0 20 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72            rUnsor
240e0 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20  ted, rCost));.  
240f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24100 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72         rCost = r
24110 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
24120 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
24130 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
24140 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
24150 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65   added to the se
24160 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t of.        ** 
24170 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f  mxChoice best-so
24180 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20  -far paths..    
24190 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
241a0 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72  * First look for
241b0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74   an existing pat
241c0 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d  h among best-so-
241d0 66 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20  far paths.      
241e0 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73    ** that covers
241f0 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
24200 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
24210 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65  he same isOrdere
24220 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  d.        ** set
24230 74 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72  ting as the curr
24240 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61  ent path candida
24250 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  te..        **. 
24260 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65         ** The te
24270 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64  rm "((pTo->isOrd
24280 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
24290 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75  0x80)==0" is equ
242a0 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20  ivalent.        
242b0 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72  ** to (pTo->isOr
242c0 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69  dered==(-1))==(i
242d0 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22  sOrdered==(-1))"
242e0 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20   for the range. 
242f0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67         ** of leg
24300 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73  al values for is
24310 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e  Ordered, -1..64.
24320 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
24330 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54      for(jj=0, pT
24340 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a  o=aTo; jj<nTo; j
24350 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
24360 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
24370 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65  maskLoop==maskNe
24380 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
24390 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
243a0 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
243b0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29  )==0.          )
243c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
243d0 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d  stcase( jj==nTo-
243e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
243f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24400 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24410 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54        if( jj>=nT
24420 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  o ){.          /
24430 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78  * None of the ex
24440 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66  isting best-so-f
24450 61 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74  ar paths match t
24460 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
24470 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
24480 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20  To>=mxChoice.   
24490 20 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73          && (rCos
244a0 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f  t>mxCost || (rCo
244b0 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55  st==mxCost && rU
244c0 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72  nsorted>=mxUnsor
244d0 74 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20  ted)).          
244e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
244f0 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61  * The current ca
24500 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65  ndidate is no be
24510 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66  tter than any of
24520 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
24530 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74            ** pat
24540 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  hs currently in 
24550 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  the best-so-far 
24560 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63  buffer.  So disc
24570 61 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ard.            
24580 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74  ** this candidat
24590 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e  e as not viable.
245a0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
245b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
245c0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
245d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
245e0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
245f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
24600 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24610 66 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73  f("Skip   %s cos
24620 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
24630 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
24640 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
24650 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
24660 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
24670 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
24690 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
246a0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
246b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
246c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
246d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
246e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
246f0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
24700 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69  ch this points i
24710 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
24720 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70   new candidate p
24730 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ath.          **
24740 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64   needs to be add
24750 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
24760 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
24770 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  hs. */.         
24780 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
24790 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
247a0 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
247b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
247c0 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
247d0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
247e0 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
247f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24800 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
24810 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
24820 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
24830 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
24840 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
24850 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
24860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24870 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
24880 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
24890 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
248a0 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
248b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
248c0 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
248d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
248e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
248f0 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
24900 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
24910 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
24920 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
24930 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
24940 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
24950 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
24960 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
24970 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
24980 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
24990 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
249a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
249b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
249c0 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
249d0 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  if best-so-far p
249e0 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20  ath pTo=aTo[jj] 
249f0 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20  covers the.     
24a00 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74       ** same set
24a10 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
24a20 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65  s the sam isOrde
24a30 72 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74  red setting as t
24a40 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
24a50 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20  candidate path. 
24a60 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
24a70 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
24a80 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20  hould replace.  
24a90 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f          ** pTo o
24aa0 72 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  r if the candida
24ab0 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69  te should be ski
24ac0 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  pped */.        
24ad0 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
24ae0 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e  <rCost || (pTo->
24af0 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20  rCost==rCost && 
24b00 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29  pTo->nRow<=nOut)
24b10 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
24b20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
24b30 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
24b40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
24b50 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
24b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
24b70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24b80 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
24b90 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
24ba0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
24bb0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
24bc0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
24bd0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
24be0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
24bf0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
24c10 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
24c20 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
24c30 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
24c40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24c50 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
24c60 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
24c70 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
24c80 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
24c90 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
24ca0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
24cb0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
24cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24cd0 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
24ce0 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
24cf0 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
24d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
24d10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
24d20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
24d30 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
24d40 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63  h from further c
24d50 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
24d60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
24d70 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
24d80 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20  ==rCost );.     
24d90 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24da0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24db0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
24dc0 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
24dd0 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  st+1 );.        
24de0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
24df0 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65  ches here if the
24e00 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
24e10 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  is better than t
24e20 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
24e30 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61  pTo path.  Repla
24e40 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20  ce pTo with the 
24e50 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69  candidate. */.#i
24e60 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
24e70 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
24e80 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
24e90 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
24ea0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
24eb0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24ec0 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
24ed0 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
24ee0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
24ef0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24f10 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
24f20 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
24f30 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
24f50 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
24f60 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
24f70 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
24f80 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24f90 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
24fa0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
24fb0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
24fc0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
24fd0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
24fe0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
24ff0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25010 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
25020 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
25030 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
25040 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
25050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25060 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
25070 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
25080 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
25090 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
250a0 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
250b0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
250c0 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
250d0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
250e0 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
250f0 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
25100 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
25110 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
25120 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
25130 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55  .        pTo->rU
25140 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72  nsorted = rUnsor
25150 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ted;.        pTo
25160 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
25170 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
25180 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
25190 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
251a0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
251b0 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
251c0 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
251d0 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
251e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
251f0 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
25200 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
25210 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
25220 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
25230 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e  ;.          mxUn
25240 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e  sorted = aTo[0].
25250 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
25260 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
25270 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
25280 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
25290 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
252a0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
252b0 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
252c0 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
252d0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
252e0 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73  >rUnsorted>mxUns
252f0 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20  orted) .        
25300 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
25310 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
25320 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
25330 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
25340 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  ed = pTo->rUnsor
25350 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ted;.           
25360 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
25370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
253a0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
253b0 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d  E_ENABLED  /* >=
253c0 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  2 */.    if( sql
253d0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
253e0 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73   0x02 ){.      s
253f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25400 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f  f("---- after ro
25410 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20  und %d ----\n", 
25420 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f  iLoop);.      fo
25430 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(ii=0, pTo=aTo;
25440 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70   ii<nTo; ii++, p
25450 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  To++){.        s
25460 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25470 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  f(" %s cost=%-3d
25480 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72   nrow=%-3d order
25490 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
254a0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
254b0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
254c0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
254d0 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
254e0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
254f0 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  d>=0 ? (pTo->isO
25500 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f  rdered+'0') : '?
25510 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
25520 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30  pTo->isOrdered>0
25530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
25540 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25550 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
25560 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
25570 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25580 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25590 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
255a0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
255b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
255c0 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
255d0 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
255e0 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
255f0 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
25600 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
25610 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
25620 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
25630 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
25640 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
25650 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
25660 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25670 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25680 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
25690 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
256a0 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
256b0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
256c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
256d0 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
256e0 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
256f0 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
25700 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
25710 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
25720 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
25730 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
25740 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
25750 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
25760 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
25770 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
25780 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
25790 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
257a0 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
257b0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
257c0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
257d0 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
257e0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
257f0 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
25800 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
25810 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
25820 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
25830 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
25840 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
25850 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
25860 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
25870 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
25880 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
25890 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
258a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
258b0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
258c0 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
258d0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
258e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
258f0 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
25900 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
25910 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25920 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
25930 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
25940 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
25950 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
25960 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
25970 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
25980 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
25990 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
259a0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
259b0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 44 69  nfo, pWInfo->pDi
259c0 73 74 69 6e 63 74 53 65 74 2c 20 70 46 72 6f 6d  stinctSet, pFrom
259d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
259e0 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
259f0 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
25a00 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
25a10 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
25a20 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
25a30 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53 65 74  fo->pDistinctSet
25a40 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
25a50 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25a60 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
25a70 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
25a80 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
25a90 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
25aa0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
25ab0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
25ac0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
25ad0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  {.      if( pFro
25ae0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57  m->isOrdered==pW
25af0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
25b00 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
25b10 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25b20 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
25b30 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
25b40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
25b50 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
25b60 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  BSat = pFrom->is
25b70 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70  Ordered;.      p
25b80 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
25b90 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
25ba0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
25bb0 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a  o->nOBSat<=0 ){.
25bc0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
25bd0 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20  nOBSat = 0;.    
25be0 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20      if( nLoop>0 
25bf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
25c00 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f 6d   wsFlags = pFrom
25c10 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
25c20 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
25c30 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67       if( (wsFlag
25c40 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
25c50 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )==0 .          
25c60 20 26 26 20 28 77 73 46 6c 61 67 73 26 28 57 48   && (wsFlags&(WH
25c70 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f  ERE_IPK|WHERE_CO
25c80 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45 52  LUMN_IN))!=(WHER
25c90 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55  E_IPK|WHERE_COLU
25ca0 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20  MN_IN).         
25cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25cc0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20  Bitmask m = 0;. 
25cd0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
25ce0 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  c = wherePathSat
25cf0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
25d00 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  Info, pWInfo->pO
25d10 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a 20  rderBy, pFrom,. 
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44 45 52       WHERE_ORDER
25d40 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70 2d  BY_LIMIT, nLoop-
25d50 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
25d60 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a 20  nLoop-1], &m);. 
25d70 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
25d80 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
25d90 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20 20  HERE_IPK );.    
25da0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25db0 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
25dc0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20  E_COLUMN_IN );. 
25dd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
25de0 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  c==pWInfo->pOrde
25df0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
25e00 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
25e10 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  fo->bOrderedInne
25e20 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20  rLoop = 1;.     
25e30 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
25e40 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20  >revMask = m;.  
25e50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25e70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
25e80 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
25e90 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
25ea0 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29  ERE_SORTBYGROUP)
25eb0 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e  .        && pWIn
25ec0 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e  fo->nOBSat==pWIn
25ed0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
25ee0 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20  xpr && nLoop>0. 
25ef0 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d     ){.      Bitm
25f00 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
25f10 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65  .      int nOrde
25f20 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  r = wherePathSat
25f30 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
25f40 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  Info, pWInfo->pO
25f50 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
25f60 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f     pFrom, 0, nLo
25f70 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
25f80 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65  op[nLoop-1], &re
25f90 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20  vMask.      );. 
25fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
25fb0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29  nfo->sorted==0 )
25fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64  ;.      if( nOrd
25fd0 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er==pWInfo->pOrd
25fe0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
25ff0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73         pWInfo->s
26000 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  orted = 1;.     
26010 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
26020 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  sk = revMask;.  
26030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26040 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ..  pWInfo->nRow
26050 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
26060 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
26070 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
26080 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
26090 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
260a0 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
260b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
260c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
260d0 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
260e0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
260f0 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
26100 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
26110 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
26120 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
26130 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
26140 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
26150 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
26160 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
26170 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
26180 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
26190 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
261a0 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
261b0 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
261c0 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
261d0 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
261e0 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
261f0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
26200 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
26210 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
26220 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
26230 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
26240 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
26250 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
26260 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
26270 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
26280 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
26290 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
262a0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
262b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
262c0 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
262d0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
262e0 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
262f0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
26300 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26310 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
26320 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
26330 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
26340 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
26350 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
26360 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
26370 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
26380 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57  dex *pIdx;..  pW
26390 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
263a0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
263b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
263c0 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
263d0 43 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e 20  CLAUSE ) return 
263e0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
263f0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
26400 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
26410 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
26420 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
26430 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
26440 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
26450 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
26460 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67  .  if( pItem->fg
26470 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72  .isIndexedBy ) r
26480 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
26490 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
264a0 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
264b0 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
264c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
264d0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
264e0 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d  gs = 0;.  pLoop-
264f0 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54  >nSkip = 0;.  pT
26500 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
26510 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
26520 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
26530 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  EQ|WO_IS, 0);.  
26540 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
26550 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
26560 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
26570 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  _IS );.    pLoop
26580 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
26590 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
265a0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
265b0 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
265c0 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
265d0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
265e0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
265f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
26600 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
26610 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
26620 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
26630 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
26640 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
26650 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
26660 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  10) */.  }else{.
26670 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
26680 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
26690 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
266a0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  t){.      int op
266b0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  Mask;.      asse
266c0 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rt( pLoop->aLTer
266d0 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61  mSpace==pLoop->a
266e0 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69  LTerm );.      i
266f0 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  f( !IsUniqueInde
26700 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c  x(pIdx).       |
26710 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
26720 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
26730 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   || pIdx->nKeyCo
26740 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  l>ArraySize(pLoo
26750 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
26760 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
26770 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  e;.      opMask 
26780 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  = pIdx->uniqNotN
26790 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f  ull ? (WO_EQ|WO_
267a0 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20  IS) : WO_EQ;.   
267b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
267c0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
267d0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
267e0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
267f0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
26800 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c  r, j, 0, opMask,
26810 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
26820 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
26830 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65  reak;.        te
26840 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
26850 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
26860 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   );.        pLoo
26870 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
26880 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
26890 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
268a0 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
268b0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
268c0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
268d0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
268e0 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
268f0 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
26900 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69  ( pIdx->isCoveri
26910 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f  ng || (pItem->co
26920 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
26930 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
26940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
26950 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
26960 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
26970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
26980 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
26990 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
269a0 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
269b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
269c0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
269d0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
269e0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
269f0 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
26a00 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
26a10 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
26a20 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
26a30 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
26a40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26a50 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
26a60 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
26a70 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
26a80 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
26a90 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
26aa0 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
26ab0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  pLoop->maskSelf 
26ac0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
26ad0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
26ae0 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
26af0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
26b00 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
26b10 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
26b20 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
26b30 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
26b40 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
26b50 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70  Sat =  pWInfo->p
26b60 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
26b70 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
26b80 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26b90 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
26ba0 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
26bb0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
26bc0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
26bd0 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
26be0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
26bf0 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
26c00 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
26c10 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
26c20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
26c30 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
26c40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
26c50 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
26c60 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
26c70 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
26c80 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
26c90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
26ca0 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
26cb0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
26cc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
26cd0 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
26ce0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
26cf0 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
26d00 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
26d10 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
26d20 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
26d30 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
26d40 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
26d50 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
26d60 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
26d70 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
26d80 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
26d90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
26da0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
26db0 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
26dc0 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
26dd0 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
26de0 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
26df0 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
26e00 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
26e10 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
26e20 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
26e30 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
26e40 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
26e50 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
26e60 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
26e70 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
26e80 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
26e90 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
26ea0 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
26eb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
26ec0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
26ed0 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
26ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
26ef0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
26f00 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
26f10 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
26f20 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
26f30 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
26f40 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
26f50 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
26f60 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
26f70 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
26f80 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
26f90 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
26fa0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
26fb0 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
26fc0 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
26fd0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
26fe0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
26ff0 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
27000 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
27010 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
27040 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
27050 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
27080 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
27090 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
270a0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
270b0 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
270c0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
270d0 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
270e0 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
270f0 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
27100 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
27110 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
27120 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
27130 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
27140 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
27150 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
27160 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
27170 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
27180 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
27190 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
271a0 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
271b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
271c0 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
271d0 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
271e0 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
271f0 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
27200 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
27210 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
27220 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
27230 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
27240 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
27250 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
27260 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
27270 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
27280 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
27290 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
272a0 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
272b0 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
272c0 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
272d0 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
272e0 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
272f0 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
27300 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
27310 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
27320 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
27330 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
27340 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
27350 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
27360 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
27370 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
27380 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
27390 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
273a0 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
273b0 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
273c0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
273d0 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
273e0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
273f0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
27400 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
27410 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
27420 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
27430 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
27440 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
27450 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
27460 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
27470 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
27480 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
27490 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
274a0 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
274b0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
274c0 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
274d0 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
274e0 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
274f0 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
27500 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
27510 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
27520 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
27530 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
27540 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
27550 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
27560 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
27570 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
27580 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
27590 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
275a0 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
275b0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
275c0 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
275d0 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
275e0 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
275f0 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
27600 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
27610 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
27620 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
27630 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
27640 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
27650 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
27660 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
27670 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
27680 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
27690 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
276a0 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
276b0 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
276c0 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
276d0 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
276e0 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
276f0 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
27700 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
27710 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
27720 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
27730 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
27740 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
27750 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
27760 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
27770 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27780 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
27790 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
277a0 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
277b0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
277c0 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
277d0 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
277e0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
277f0 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
27800 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
27810 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
27820 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
27830 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
27840 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
27850 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
27860 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
27870 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
27880 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
27890 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
278a0 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
278b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
278c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
278d0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
278e0 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
278f0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
27900 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
27910 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
27920 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
27930 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
27940 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
27950 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
27960 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
27970 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
27980 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
27990 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
279a0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
279b0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
279c0 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70  ** The iIdxCur p
279d0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
279e0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
279f0 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a   an index.  If .
27a00 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  ** WHERE_OR_SUBC
27a10 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49  LAUSE is set, iI
27a20 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72  dxCur is the cur
27a30 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  sor number of an
27a40 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65   index.** to use
27a50 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
27a60 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20  rocessing.  The 
27a70 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f  WHERE clause sho
27a80 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  uld use this.** 
27a90 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e  specific cursor.
27aa0 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41    If WHERE_ONEPA
27ab0 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65  SS_DESIRED is se
27ac0 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20  t, then iIdxCur 
27ad0 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
27ae0 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72  cursor in an arr
27af0 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f  ay of cursors fo
27b00 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20  r all indices.  
27b10 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a  iIdxCur should.*
27b20 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d  * be used to com
27b30 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  pute the appropr
27b40 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65  iate cursor depe
27b50 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69  nding on which i
27b60 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e  ndex is.** used.
27b70 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
27b80 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
27b90 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27ba0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
27bb0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
27bc0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
27bd0 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f  pTabList,      /
27be0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
27bf0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
27c00 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
27c10 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
27c20 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ere,           /
27c30 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
27c40 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
27c50 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
27c60 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28  /* An ORDER BY (
27c70 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
27c80 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
27c90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
27ca0 74 69 6e 63 74 53 65 74 2c 20 2f 2a 20 54 72 79  tinctSet, /* Try
27cb0 20 6e 6f 74 20 74 6f 20 6f 75 74 70 75 74 20 74   not to output t
27cc0 77 6f 20 72 6f 77 73 20 74 68 61 74 20 64 75 70  wo rows that dup
27cd0 6c 69 63 61 74 65 20 74 68 65 73 65 20 2a 2f 0a  licate these */.
27ce0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
27cf0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
27d00 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
27d10 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
27d20 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
27d30 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20  AuxArg          
27d40 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
27d50 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73  R_SUBCLAUSE is s
27d60 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
27d70 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d90 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53    ** If WHERE_US
27da0 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68  E_LIMIT, then th
27db0 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a  e limit amount *
27dc0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
27dd0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
27de0 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20    /* Num. bytes 
27df0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68  allocated for Wh
27e00 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a  ereInfo struct *
27e10 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  /.  int nTabList
27e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27e30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
27e40 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74  ents in pTabList
27e50 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
27e60 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
27e70 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
27e80 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
27e90 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
27ea0 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
27eb0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
27ec0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
27ed0 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
27ee0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
27ef0 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
27f00 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74   /* Cursors that
27f10 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73   are not yet pos
27f20 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65  itioned */.  Whe
27f30 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57  reLoopBuilder sW
27f40 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57  LB;     /* The W
27f50 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72  hereLoop builder
27f60 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
27f70 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
27f80 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
27f90 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
27fa0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
27fb0 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  vel;        /* A
27fc0 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
27fd0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a   pWInfo->a[] */.
27fe0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
27ff0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
28000 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e  Pointer to a sin
28010 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  gle WhereLoop ob
28020 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69  ject */.  int ii
28030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28040 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
28050 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
28060 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
28070 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28080 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
28090 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
280a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
280b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
280c0 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20  u8 bFordelete = 
280d0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50  0;         /* OP
280e0 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f  FLAG_FORDELETE o
280f0 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f  r zero, as appro
28100 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73  priate */..  ass
28110 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
28120 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
28130 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c  _MULTIROW)==0 ||
28140 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72   (.        (wctr
28150 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
28160 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
28170 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74  =0 .     && (wct
28180 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28190 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
281a0 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e   .  ));..  /* On
281b0 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f  ly one of WHERE_
281c0 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20  OR_SUBCLAUSE or 
281d0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
281e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
281f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28200 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
28210 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
28220 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
28230 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d  HERE_USE_LIMIT)=
28240 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  =0 );..  /* Vari
28250 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
28260 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
28270 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
28280 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
28290 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f  eof(sWLB));..  /
282a0 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50  * An ORDER/GROUP
282b0 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f   BY clause of mo
282c0 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73  re than 63 terms
282d0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
282e0 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61  ized */.  testca
282f0 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  se( pOrderBy && 
28300 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
28310 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
28320 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
28330 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  erBy->nExpr>=BMS
28340 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
28350 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
28360 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
28370 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
28380 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
28390 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
283a0 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
283b0 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
283c0 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
283d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
283e0 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
283f0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
28400 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
28410 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
28420 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
28430 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
28440 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
28450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
28460 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
28470 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
28480 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
28490 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
284a0 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
284b0 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
284c0 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
284d0 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
284e0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
284f0 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
28500 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28510 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
28520 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
28530 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
28540 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
28550 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
28560 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
28570 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
28580 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
28590 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
285a0 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
285b0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
285c0 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  USE flag is set,
285d0 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
285e0 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
285f0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
28600 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
28610 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
28620 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
28630 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
28640 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
28650 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
28660 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
28670 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
28680 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28690 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
286a0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
286b0 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
286c0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
286d0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
286e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
286f0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
28700 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
28710 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
28720 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
28730 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
28740 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
28750 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
28760 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
28770 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
28780 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
28790 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
287a0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
287b0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
287c0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
287d0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
287e0 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
287f0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
28800 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
28810 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
28820 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
28830 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
28840 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
28850 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
28860 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
28870 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
28880 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
28890 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
288a0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
288b0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
288c0 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
288d0 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
288e0 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
288f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
28900 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
28910 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
28920 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
28930 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
28940 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
28950 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
28960 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
28970 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
28980 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
28990 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
289a0 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
289b0 70 44 69 73 74 69 6e 63 74 53 65 74 20 3d 20 70  pDistinctSet = p
289c0 44 69 73 74 69 6e 63 74 53 65 74 3b 0a 20 20 70  DistinctSet;.  p
289d0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
289e0 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
289f0 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
28a00 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
28a10 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
28a20 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
28a30 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  reak = pWInfo->i
28a40 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
28a50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
28a60 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
28a70 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
28a80 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
28a90 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72  >iLimit = iAuxAr
28aa0 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  g;.  pWInfo->sav
28ab0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
28ac0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
28ad0 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49  p;.  memset(&pWI
28ae0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c 20  nfo->nOBSat, 0, 
28af0 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  .         offset
28b00 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73 57 43  of(WhereInfo,sWC
28b10 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65  ) - offsetof(Whe
28b20 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29 29 3b  reInfo,nOBSat));
28b30 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66  .  memset(&pWInf
28b40 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65  o->a[0], 0, size
28b50 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b 6e 54  of(WhereLoop)+nT
28b60 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28 57 68  abList*sizeof(Wh
28b70 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 61 73  ereLevel));.  as
28b80 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  sert( pWInfo->eO
28b90 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
28ba0 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41  OFF );  /* ONEPA
28bb0 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f  SS defaults to O
28bc0 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74  FF */.  pMaskSet
28bd0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
28be0 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49  kSet;.  sWLB.pWI
28bf0 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
28c00 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e  sWLB.pWC = &pWIn
28c10 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e  fo->sWC;.  sWLB.
28c20 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f  pNew = (WhereLoo
28c30 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e  p*)(((char*)pWIn
28c40 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b  fo)+nByteWInfo);
28c50 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
28c60 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
28c70 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20  sWLB.pNew) );.  
28c80 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57  whereLoopInit(sW
28c90 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66  LB.pNew);.#ifdef
28ca0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
28cb0 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d  sWLB.pNew->cId =
28cc0 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   '*';.#endif..  
28cd0 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
28ce0 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
28cf0 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
28d00 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
28d10 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
28d20 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
28d30 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
28d40 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
28d50 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
28d60 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  t);.  sqlite3Whe
28d70 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57  reClauseInit(&pW
28d80 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66  Info->sWC, pWInf
28d90 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  o);.  sqlite3Whe
28da0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
28db0 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
28dc0 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a  _AND);.    .  /*
28dd0 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
28de0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
28df0 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
28e00 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
28e10 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
28e20 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
28e30 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
28e40 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
28e50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
28e60 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e  ; ii<sWLB.pWC->n
28e70 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
28e80 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
28e90 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
28ea0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
28eb0 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d  (sWLB.pWC->a[ii]
28ec0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
28ed0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28ee0 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42  lse(pParse, sWLB
28ef0 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
28f00 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  r, pWInfo->iBrea
28f10 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
28f20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
28f30 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
28f40 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e        sWLB.pWC->
28f50 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d  a[ii].wtFlags |=
28f60 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
28f70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65   }.  }..  /* Spe
28f80 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
28f90 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
28fa0 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
28fb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
28fc0 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
28fd0 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79  OBSat = pOrderBy
28fe0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->nExpr;.    if(
28ff0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
29000 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
29010 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
29020 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
29030 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
29040 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
29050 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
29060 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
29070 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
29080 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
29090 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
290a0 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66  The N-th term of
290b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
290c0 20 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62   is assigned a b
290d0 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a  itmask of 1<<N..
290e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75    **.  ** The ru
290f0 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  le of the previo
29100 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75  us sentence ensu
29110 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73  res thta if X is
29120 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
29130 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c  .  ** a table T,
29140 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65   then X-1 is the
29150 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
29160 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
29170 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a   the left of T..
29180 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65    ** Knowing the
29190 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
291a0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
291b0 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
291c0 69 6e 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6f 72  in is.  ** impor
291d0 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
291e0 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
291f0 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
29200 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
29210 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
29220 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
29230 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
29240 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
29250 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
29260 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
29270 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
29280 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
29290 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
292a0 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
292b0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
292c0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
292d0 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
292e0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
292f0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
29300 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61   ii++){.    crea
29310 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
29320 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
29330 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  .iCursor);.    s
29340 71 6c 69 74 65 33 57 68 65 72 65 54 61 62 46 75  qlite3WhereTabFu
29350 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 26  ncArgs(pParse, &
29360 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c  pTabList->a[ii],
29370 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
29380 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
29390 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 69  E_DEBUG.  for(ii
293a0 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d  =0; ii<pTabList-
293b0 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nSrc; ii++){.  
293c0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71    Bitmask m = sq
293d0 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
293e0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
293f0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
29400 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  sor);.    assert
29410 28 20 6d 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29  ( m==MASKBIT(ii)
29420 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
29430 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
29440 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
29450 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c  ssions. */.  sql
29460 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61  ite3WhereExprAna
29470 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 26  lyze(pTabList, &
29480 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20  pWInfo->sWC);.  
29490 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
294a0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
294b0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
294c0 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
294d0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
294e0 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20  INCT ){.    if( 
294f0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
29500 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
29510 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
29520 57 43 2c 20 70 44 69 73 74 69 6e 63 74 53 65 74  WC, pDistinctSet
29530 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
29540 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69  e DISTINCT marki
29550 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e  ng is pointless.
29560 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a    Ignore it. */.
29570 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
29580 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
29590 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
295a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
295b0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
295c0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52      /* Try to OR
295d0 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c  DER BY the resul
295e0 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69  t set to make di
295f0 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e  stinct processin
29600 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20  g easier */.    
29610 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
29620 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49  lags |= WHERE_DI
29630 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20  STINCTBY;.      
29640 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
29650 20 3d 20 70 44 69 73 74 69 6e 63 74 53 65 74 3b   = pDistinctSet;
29660 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29670 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
29680 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
29690 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
296a0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
296b0 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ED).  if( sqlite
296c0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
296d0 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  ffff ){.    sqli
296e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
296f0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
29700 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c  art *** (wctrlFl
29710 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c  ags: 0x%x",wctrl
29720 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
29730 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
29740 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a  RE_USE_LIMIT ){.
29750 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
29760 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69  ugPrintf(", limi
29770 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29  t: %d", iAuxArg)
29780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29790 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
297a0 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )\n");.  }.  if(
297b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
297c0 63 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a  ce & 0x100 ){ /*
297d0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
297e0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
297f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  clause */.    sq
29800 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
29810 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b  Print(sWLB.pWC);
29820 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
29830 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
29840 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
29850 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
29860 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
29870 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
29880 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29890 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
298a0 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45  .  .#ifdef WHERE
298b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
298c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
298d0 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a  reTrace ){    /*
298e0 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
298f0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
29900 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57  jects */.      W
29910 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
29920 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
29930 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
29940 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
29950 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
29960 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
29970 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299a0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
299b0 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
299c0 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
299d0 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
299e0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
299f0 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
29a00 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
29a10 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
29a20 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
29a30 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
29a40 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
29a50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29a60 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
29a70 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
29a80 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
29a90 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
29aa0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29ab0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
29ac0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
29ad0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
29ae0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
29af0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
29b00 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
29b10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
29b20 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
29b30 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
29b40 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
29b50 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
29b60 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
29b70 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
29b80 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
29b90 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49  >revMask = ALLBI
29ba0 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  TS;.  }.  if( pP
29bb0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
29bc0 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
29bd0 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
29be0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
29bf0 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
29c00 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
29c10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
29c20 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
29c30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29c40 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
29c50 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
29c60 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
29c70 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
29c80 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  BSat>0 ){.      
29c90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29ca0 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c  tf(" ORDERBY=%d,
29cb0 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
29cc0 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d  >nOBSat, pWInfo-
29cd0 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
29ce0 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
29cf0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
29d00 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
29d10 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
29d20 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
29d30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
29d40 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
29d50 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
29d60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
29d70 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
29d80 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
29d90 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
29da0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
29db0 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
29dc0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
29dd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
29de0 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
29df0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
29e00 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
29e10 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
29e20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
29e30 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
29e40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
29e50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
29e60 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
29e70 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
29e80 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
29e90 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
29ea0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
29eb0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
29ec0 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
29ed0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
29ee0 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
29ef0 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f   omit tables fro
29f00 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20  m the join that 
29f10 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68  do not effect th
29f20 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
29f30 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
29f40 3e 3d 32 0a 20 20 20 26 26 20 70 44 69 73 74 69  >=2.   && pDisti
29f50 6e 63 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  nctSet!=0.   && 
29f60 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
29f70 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
29f80 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
29f90 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
29fa0 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57  bUsed = sqlite3W
29fb0 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
29fc0 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 44 69 73  e(pMaskSet, pDis
29fd0 74 69 6e 63 74 53 65 74 29 3b 0a 20 20 20 20 69  tinctSet);.    i
29fe0 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
29ff0 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
2a000 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
2a010 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
2a020 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
2a030 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
2a040 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
2a050 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
2a060 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2a070 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
2a080 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
2a090 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
2a0a0 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
2a0b0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
2a0c0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2a0d0 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a  Loop->iTab].fg.j
2a0e0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
2a0f0 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
2a100 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
2a110 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
2a120 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
2a130 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
2a140 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2a150 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
2a160 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
2a170 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2a180 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
2a190 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2a1a0 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a1b0 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
2a1c0 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
2a1d0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
2a1e0 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
2a1f0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
2a200 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
2a210 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2a220 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
2a230 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2a240 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
2a250 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
2a260 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
2a270 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
2a280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
2a290 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2a2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a2b0 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
2a2c0 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
2a2d0 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
2a2e0 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
2a2f0 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
2a300 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
2a310 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
2a320 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
2a330 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
2a340 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
2a350 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
2a360 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
2a370 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
2a380 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2a390 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
2a3a0 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
2a3b0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
2a3c0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2a3d0 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
2a3e0 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
2a3f0 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
2a400 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
2a410 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
2a420 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
2a430 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2a440 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2a450 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2a460 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
2a470 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
2a480 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
2a490 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2a4a0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2a4b0 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  ){.    int wsFla
2a4c0 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  gs = pWInfo->a[0
2a4d0 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2a4e0 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72  s;.    int bOner
2a4f0 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  ow = (wsFlags & 
2a500 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30  WHERE_ONEROW)!=0
2a510 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f  ;.    if( bOnero
2a520 77 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72  w.     || ((wctr
2a530 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a540 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
2a550 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
2a560 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20  & 0==(wsFlags & 
2a570 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2a580 4c 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  LE)).    ){.    
2a590 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61    pWInfo->eOnePa
2a5a0 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f  ss = bOnerow ? O
2a5b0 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20  NEPASS_SINGLE : 
2a5c0 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20  ONEPASS_MULTI;. 
2a5d0 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
2a5e0 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
2a5f0 2e 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61  .pTab) && (wsFla
2a600 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2a610 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NLY) ){.        
2a620 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2a630 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
2a640 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20  ULTIROW ){.     
2a650 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20       bFordelete 
2a660 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  = OPFLAG_FORDELE
2a670 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  TE;.        }.  
2a680 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
2a690 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
2a6a0 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  gs = (wsFlags & 
2a6b0 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  ~WHERE_IDX_ONLY)
2a6c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a6d0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2a6e0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2a6f0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
2a700 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
2a710 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
2a720 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
2a730 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2a740 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2a750 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
2a760 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
2a770 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2a780 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
2a790 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2a7a0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
2a7b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
2a7c0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a7d0 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
2a7e0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
2a7f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
2a800 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
2a810 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2a820 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2a830 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
2a840 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2a850 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2a860 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
2a870 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2a880 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2a890 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
2a8a0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2a8b0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2a8c0 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
2a8d0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2a8e0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
2a8f0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
2a900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a910 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2a920 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2a930 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2a940 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
2a950 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2a960 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
2a970 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2a980 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
2a990 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
2a9a0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
2a9b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
2a9c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2a9d0 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
2a9e0 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
2a9f0 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
2aa00 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
2aa10 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
2aa20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
2aa30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2aa40 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2aa50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2aa60 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
2aa70 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2aa80 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2aa90 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20  BCLAUSE)==0 ){. 
2aaa0 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
2aab0 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
2aac0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2aad0 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2aae0 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  FF ){.        op
2aaf0 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
2ab00 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
2ab10 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  >aiCurOnePass[0]
2ab20 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2ab30 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  rsor;.      };. 
2ab40 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
2ab50 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2ab60 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
2ab70 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
2ab80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ab90 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2aba0 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  ==pLevel->iTabCu
2abb0 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  r );.      testc
2abc0 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ase( pWInfo->eOn
2abd0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2abe0 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2abf0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2ac00 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
2ac10 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2ac20 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
2ac30 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
2ac40 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2ac50 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2ac60 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e  SS_OFF && pTab->
2ac70 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52  nCol<BMS && HasR
2ac80 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
2ac90 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
2aca0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
2acb0 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
2acc0 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
2acd0 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
2ace0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
2acf0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2ad00 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54  eP4(v, -1, SQLIT
2ad10 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
2ad20 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
2ad30 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
2ad40 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
2ad50 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2ad60 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
2ad70 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28  _HINTS.      if(
2ad80 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2ad90 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
2ada0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2adb0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
2adc0 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65  AG_SEEKEQ|bForde
2add0 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lete);.      }el
2ade0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2adf0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ae00 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2ae10 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20   bFordelete);.  
2ae20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2ae30 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2ae40 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
2ae50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ae60 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
2ae70 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49  lumnsUsed, pTabI
2ae80 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c  tem->iCursor, 0,
2ae90 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aeb0 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62  (const u8*)&pTab
2aec0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50  Item->colUsed, P
2aed0 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66  4_INT64);.#endif
2aee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2aef0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
2af00 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
2af10 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
2af20 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
2af30 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
2af40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2af50 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
2af60 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
2af70 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2af80 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
2af90 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
2afa0 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
2afb0 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
2afc0 20 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61   iAuxArg is alwa
2afd0 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70  ys set if to a p
2afe0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
2aff0 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73   ONEPASS is poss
2b000 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ible */.      as
2b010 73 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30  sert( iAuxArg!=0
2b020 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
2b030 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2b040 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2b050 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2b060 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2b070 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79   && IsPrimaryKey
2b080 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20  Index(pIx).     
2b090 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
2b0a0 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
2b0b0 4c 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20  LAUSE)!=0.      
2b0c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2b0d0 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f  is is one term o
2b0e0 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61  f an OR-optimiza
2b0f0 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50  tion using the P
2b100 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a  RIMARY KEY of a.
2b110 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f          ** WITHO
2b120 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
2b130 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73   No need for a s
2b140 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f  eparate index */
2b150 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2b160 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
2b170 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70  bCur;.        op
2b180 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2b190 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  e if( pWInfo->eO
2b1a0 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
2b1b0 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49  OFF ){.        I
2b1c0 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49  ndex *pJ = pTabI
2b1d0 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  tem->pTab->pInde
2b1e0 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  x;.        iInde
2b1f0 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
2b200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b210 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b220 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2b230 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ED );.        wh
2b240 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20  ile( ALWAYS(pJ) 
2b250 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20  && pJ!=pIx ){.  
2b260 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2b270 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
2b280 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20  J = pJ->pNext;. 
2b290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b2a0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
2b2b0 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
2b2c0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
2b2d0 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  [1] = iIndexCur;
2b2e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2b2f0 20 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74   iAuxArg && (wct
2b300 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2b310 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30  OR_SUBCLAUSE)!=0
2b320 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64   ){.        iInd
2b330 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b  exCur = iAuxArg;
2b340 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2b350 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20  _ReopenIdx;.    
2b360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b370 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61   iIndexCur = pPa
2b380 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2b390 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65     }.      pLeve
2b3a0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e  l->iIdxCur = iIn
2b3b0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73  dexCur;.      as
2b3c0 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65  sert( pIx->pSche
2b3d0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
2b3e0 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  a );.      asser
2b3f0 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20  t( iIndexCur>=0 
2b400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20  );.      if( op 
2b410 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2b420 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b430 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70  op, iIndexCur, p
2b440 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  Ix->tnum, iDb);.
2b450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b460 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
2b470 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
2b480 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
2b490 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2b4a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30  E_CONSTRAINT)!=0
2b4b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c  .         && (pL
2b4c0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
2b4d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
2b4e0 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41  GE|WHERE_SKIPSCA
2b4f0 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  N))==0.         
2b500 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
2b510 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
2b520 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20  ERBY_MIN)==0.   
2b530 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b540 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2b550 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
2b560 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74  SEEKEQ); /* Hint
2b570 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20   to COMDB2 */.  
2b580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b590 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2b5a0 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
2b5b0 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
2b5c0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2b5d0 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20  USED_MASK.      
2b5e0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36    {.          u6
2b5f0 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20  4 colUsed = 0;. 
2b600 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c           int ii,
2b610 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66   jj;.          f
2b620 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d  or(ii=0; ii<pIx-
2b630 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  >nColumn; ii++){
2b640 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
2b650 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pIx->aiColumn[
2b660 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii];.           
2b670 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74   if( jj<0 ) cont
2b680 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2b690 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a    if( jj>63 ) jj
2b6a0 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20   = 63;.         
2b6b0 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d     if( (pTabItem
2b6c0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
2b6d0 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f  BIT(jj))==0 ) co
2b6e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b6f0 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28      colUsed |= (
2b700 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20  (u64)1)<<(ii<63 
2b710 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20  ? ii : 63);.    
2b720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b740 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
2b750 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65  lumnsUsed, iInde
2b760 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  xCur, 0, 0,.    
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b780 20 20 20 20 20 20 20 20 20 20 20 20 28 75 38 2a              (u8*
2b790 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e  )&colUsed, P4_IN
2b7a0 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T64);.        }.
2b7b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2b7c0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
2b7d0 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20  SED_MASK */.    
2b7e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2b7f0 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74  ( iDb>=0 ) sqlit
2b800 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
2b810 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
2b820 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
2b830 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2b840 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2b850 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2b860 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2b870 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2b880 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
2b890 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
2b8a0 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
2b8b0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2b8c0 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
2b8d0 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
2b8e0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
2b8f0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
2b900 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
2b910 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
2b920 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
2b930 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  )0;.  for(ii=0; 
2b940 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
2b950 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  +){.    int addr
2b960 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74  Explain;.    int
2b970 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c   wsFlags;.    pL
2b980 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2b990 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61  a[ii];.    wsFla
2b9a0 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  gs = pLevel->pWL
2b9b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69  oop->wsFlags;.#i
2b9c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b9d0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2b9e0 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
2b9f0 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
2ba00 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
2ba10 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
2ba20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
2ba30 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
2ba40 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  e, &pWInfo->sWC,
2ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ba60 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2ba70 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f  evel->iFrom], no
2ba80 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
2ba90 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
2baa0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2bab0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2bac0 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  or;.    }.#endif
2bad0 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e  .    addrExplain
2bae0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
2baf0 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
2bb00 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
2bb10 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2bb20 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72   ii, pLevel->iFr
2bb30 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20  om, wctrlFlags. 
2bb40 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c     );.    pLevel
2bb50 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
2bb60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2bb70 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
2bb80 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68  eady = sqlite3Wh
2bb90 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  ereCodeOneLoopSt
2bba0 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
2bbb0 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
2bbc0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
2bbd0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
2bbe0 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73  ont;.    if( (ws
2bbf0 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  Flags&WHERE_MULT
2bc00 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74  I_OR)==0 && (wct
2bc10 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
2bc20 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29  _SUBCLAUSE)==0 )
2bc30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
2bc40 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75  hereAddScanStatu
2bc50 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  s(v, pTabList, p
2bc60 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61  Level, addrExpla
2bc70 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  in);.    }.  }..
2bc80 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20    /* Done. */.  
2bc90 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
2bca0 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45  t((v, "Begin WHE
2bcb0 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65  RE-core"));.  re
2bcc0 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
2bcd0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
2bce0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2bcf0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a  whereBeginError:
2bd00 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
2bd10 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
2bd20 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2bd30 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2bd40 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
2bd50 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2bd60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2bd70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
2bd80 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
2bd90 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
2bda0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
2bdb0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
2bdc0 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
2bdd0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2bde0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2bdf0 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
2be00 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
2be10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2be20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2be30 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
2be40 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2be50 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
2be60 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68  el *pLevel;.  Wh
2be70 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
2be80 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2be90 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2bea0 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
2beb0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2bec0 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
2bed0 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
2bee0 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
2bef0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
2bf00 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
2bf10 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c  E-core"));.  sql
2bf20 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2bf30 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
2bf40 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
2bf50 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
2bf60 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
2bf70 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2bf80 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
2bf90 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
2bfa0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69  pWLoop;.    sqli
2bfb0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2bfc0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
2bfd0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
2bfe0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
2bff0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
2c000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2c010 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
2c020 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2c030 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e  el->p2, pLevel->
2c040 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p3);.      sqlit
2c050 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2c060 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
2c070 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2c080 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2c090 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
2c0a0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78  evel->op==OP_Nex
2c0b0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2c0c0 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
2c0d0 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29  el->op==OP_Prev)
2c0e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2c0f0 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2c100 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b  ->op==OP_VNext);
2c110 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2c120 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c130 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
2c140 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
2c150 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
2c160 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
2c170 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2c180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2c190 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2c1a0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
2c1b0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
2c1c0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
2c1d0 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
2c1e0 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
2c1f0 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
2c200 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c210 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2c220 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
2c230 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2c240 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d  In->eEndLoopOp!=
2c250 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2c260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c270 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
2c280 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
2c290 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
2c2a0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nTop);.         
2c2b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2c2c0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2c2d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
2c2e0 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
2c2f0 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20  P_PrevIfOpen);. 
2c300 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
2c310 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
2c320 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e  eEndLoopOp==OP_N
2c330 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  extIfOpen);.    
2c340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2c350 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2c360 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
2c370 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
2c380 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2c390 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2c3a0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2c3b0 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
2c3c0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
2c3d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c3e0 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
2c3f0 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
2c400 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c410 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
2c420 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
2c430 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2c440 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
2c450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2c460 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2c470 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
2c480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2c490 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2c4a0 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
2c4b0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
2c4c0 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
2c4d0 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
2c4e0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
2c4f0 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20  LikeRep ){.     
2c500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c510 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
2c520 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65  pZero, (int)(pLe
2c530 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
2c540 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20 20  r>>1),.         
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c560 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2c570 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ep);.      VdbeC
2c580 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2c590 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
2c5a0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2c5b0 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
2c5c0 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ws = pLoop->wsFl
2c5d0 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ags;.      addr 
2c5e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2c5f0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
2c600 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2c610 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
2c620 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
2c630 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  rt( (ws & WHERE_
2c640 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
2c650 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2c660 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
2c670 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2c680 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
2c690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c6a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2c6b0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
2c6c0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
2c6d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c6e0 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2c6f0 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20 20  _INDEXED) .     
2c700 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45 52    || ((ws & WHER
2c710 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20 70  E_MULTI_OR) && p
2c720 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
2c730 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2c740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c750 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2c760 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
2c770 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
2c780 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2c790 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
2c7a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c7b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2c7c0 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
2c7d0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
2c7e0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2c7f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2c800 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
2c810 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2c820 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2c830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2c840 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
2c850 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
2c860 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2c870 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
2c880 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2c8b0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2c8c0 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
2c8d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
2c8e0 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
2c8f0 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
2c900 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2c910 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
2c920 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
2c930 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2c940 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
2c950 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
2c960 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2c970 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
2c980 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
2c990 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2c9a0 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
2c9b0 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
2c9c0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
2c9d0 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
2c9e0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
2c9f0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
2ca00 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2ca10 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
2ca20 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2ca30 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2ca40 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2ca50 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2ca60 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2ca70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
2ca80 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
2ca90 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
2caa0 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
2cab0 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
2cac0 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
2cad0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
2cae0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
2caf0 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
2cb00 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
2cb10 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
2cb20 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
2cb30 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
2cb40 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
2cb50 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
2cb60 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2cb70 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
2cb80 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74 72  iled ){.      tr
2cb90 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43  anslateColumnToC
2cba0 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  opy(v, pLevel->a
2cbb0 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d  ddrBody, pLevel-
2cbc0 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbe0 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
2cbf0 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  regResult, 0);. 
2cc00 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2cc10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2cc20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
2cc30 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44  n index, make VD
2cc40 42 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75  BE code substitu
2cc50 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61  tions to read da
2cc60 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ta.    ** from t
2cc70 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  he index instead
2cc80 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62   of from the tab
2cc90 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  le where possibl
2cca0 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  e.  In some case
2ccb0 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70  s.    ** this op
2ccc0 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65  timization preve
2ccd0 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72  nts the table fr
2cce0 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65  om ever being re
2ccf0 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20  ad, which can.  
2cd00 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67    ** yield a sig
2cd10 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d  nificant perform
2cd20 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20  ance boost..    
2cd30 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
2cd40 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
2cd50 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
2cd60 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
2cd70 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
2cd80 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
2cd90 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
2cda0 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
2cdb0 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
2cdc0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
2cdd0 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
2cde0 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
2cdf0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
2ce00 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
2ce10 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
2ce20 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
2ce30 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
2ce40 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
2ce50 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
2ce60 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
2ce70 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2ce80 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
2ce90 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ED|WHERE_IDX_ONL
2cea0 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  Y) ){.      pIdx
2ceb0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2cec0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  e.pIndex;.    }e
2ced0 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
2cee0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
2cef0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
2cf00 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
2cf10 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
2cf20 0a 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20  .    if( pIdx.  
2cf30 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65     && (pWInfo->e
2cf40 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2cf50 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69  _OFF || !HasRowi
2cf60 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29  d(pIdx->pTable))
2cf70 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61  .     && !db->ma
2cf80 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29  llocFailed.    )
2cf90 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  {.      last = s
2cfa0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2cfb0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2cfc0 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
2cfd0 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20  Body;.      pOp 
2cfe0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
2cff0 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20  Op(v, k);.      
2d000 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  for(; k<last; k+
2d010 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
2d020 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
2d030 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2d040 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2d050 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2d060 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
2d070 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2d080 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  x = pOp->p2;.   
2d090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2d0a0 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61  Idx->pTable==pTa
2d0b0 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  b );.          i
2d0c0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2d0d0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
2d0e0 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
2d0f0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
2d100 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
2d110 20 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b           x = pPk
2d120 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20  ->aiColumn[x];. 
2d130 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2d140 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
2d150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d160 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
2d170 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
2d180 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  x);.          if
2d190 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
2d1a0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
2d1b0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  x;.            p
2d1c0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
2d1d0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2d1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d1f0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
2d200 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d210 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
2d220 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
2d230 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
2d240 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
2d250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
2d260 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2d270 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2d280 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
2d290 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
2d2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d2b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
2d2c0 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
2d2d0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
2d2e0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2d2f0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2d300 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
2d310 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2d320 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.