/ Hex Artifact Content
Login

Artifact 4b0d7b6696f2de64b3bdd2bc600f51ef6cd832fe269f2c0ad330974885c30652:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e  pareSkip(pTerm->
1ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64 78       pScan->pIdx
1b10: 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20  Expr,iCur)==0). 
1b20: 20 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61          && (pSca
1b30: 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20  n->iEquiv<=1 || 
1b40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b50: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1b60: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
1b70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b80: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
1ba0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
1bb0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
1bc0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
1bd0: 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20  an->aiCur).     
1be0: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73        && (pX = s
1bf0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c00: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
1c10: 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70  pr->pRight))->op
1c20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1c30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c40: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1c50: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c60: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
1c70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1c80: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1c90: 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69  >aiCur[j]==pX->i
1ca0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
1cb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
1cc0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e  iColumn[j]==pX->
1cd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
1d30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72      pScan->aiCur
1d50: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
1d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d70: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1d80: 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  j] = pX->iColumn
1d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1da0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b  pScan->nEquiv++;
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
1df0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e10: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
1e20: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
1e30: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
1e40: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
1e50: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
1e60: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
1e70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e80: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
1ea0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1eb0: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
1ec0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
1ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
1ef0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
1f20: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
1f30: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1f80: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
1f90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1fc0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
2000: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2020: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
2030: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2040: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2050: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2070: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
2080: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20d0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
20e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20f0: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
2100: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
2110: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
2120: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
2130: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
2150: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72  le==pScan->aiCur
2160: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
2170: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
2180: 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e  =pScan->aiColumn
2190: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
21a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
21e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2200: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2210: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  pWC = pWC;.     
2220: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
2230: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
2240: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
2250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2270: 20 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e       pWC = pWC->
2280: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
2290: 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
22a0: 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pWC!=0 );.    i
22b0: 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  f( pScan->iEquiv
22c0: 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  >=pScan->nEquiv 
22d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 57 43  ) break;.    pWC
22e0: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
22f0: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
2300: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b    pScan->iEquiv+
2310: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
2330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
2340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
2350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
2380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
2390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
23a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
23b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
23c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
23e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
23f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
2430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
2440: 2e 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d  .   Or if pIdx!=
2450: 30 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75  0 then X is colu
2460: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e  mn iColumn of in
2470: 64 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a  dex pIdx.  pIdx.
2480: 2a 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  ** must be one o
2490: 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66  f the indexes of
24a0: 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a   table iCur..**.
24b0: 2a 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  ** The <op> must
24c0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
24d0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
24e0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
24f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
2500: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
2510: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2520: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
2530: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
2540: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
2550: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
2560: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
2570: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
2580: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
2590: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
25a0: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
25b0: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
25c0: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
25d0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
25e0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
25f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2600: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
2610: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
2620: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
2630: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
2640: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
2650: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
2660: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
2670: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
2680: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
2690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
26a0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
26b0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
26c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
26d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
26e0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26f0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
2700: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2720: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
2730: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2740: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2750: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
2760: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
2770: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
2780: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
2790: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
27a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
27c0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
27d0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
27e0: 20 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e   */.){.  pScan->
27f0: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
2800: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
2810: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78  C;.  pScan->pIdx
2820: 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61  Expr = 0;.  pSca
2830: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
2840: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2850: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64  e = 0;.  if( pId
2860: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  x ){.    int j =
2870: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
2880: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
2890: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28a0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45  f( iColumn==XN_E
28b0: 58 50 52 20 29 7b 0a 20 20 20 20 20 20 70 53 63  XPR ){.      pSc
28c0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 70  an->pIdxExpr = p
28d0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
28e0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
28f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2900: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2910: 5b 6a 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [j];.    }else i
2920: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
2930: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2940: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
2950: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
2960: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
2970: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  mn>=0 ){.      p
2980: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
2990: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
29a0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
29b0: 69 74 79 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ity;.      pScan
29c0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
29d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
29e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29f0: 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50   iColumn==XN_EXP
2a00: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
2a10: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2a20: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2a30: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2a40: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2a50: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
2a60: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
2a70: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
2a80: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
2a90: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
2aa0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
2ab0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2ac0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2ad0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2ae0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2af0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2b00: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b10: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2b20: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2b30: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2b40: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72  of table iCur or
2b50: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a   of index pIdx.*
2b60: 2a 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64  * if pIdx!=0 and
2b70: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2b80: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2b90: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2ba0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20  ed by.** the op 
2bb0: 70 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75  parameter.  Retu
2bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2bd0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
2be0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21  ..**.** If pIdx!
2c00: 3d 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  =0 then it must 
2c10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
2c20: 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69  dexes of table i
2c30: 43 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68  Cur.  .** Search
2c40: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2c50: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2c60: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2c70: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2c80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2ca0: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2cb0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
2cc0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
2cd0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
2ce0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
2cf0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d00: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
2d10: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2d20: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2d30: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2d40: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2d50: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2d60: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2d70: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2d80: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2d90: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2da0: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2db0: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2dc0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2dd0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2de0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2df0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2e00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2e10: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2e20: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2e30: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2e40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2e50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2e60: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2e70: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2e80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2e90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2eb0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ec0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2ee0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2ef0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2f00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2f10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2f20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2f30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2f40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2f50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2f60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2f70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2f80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2f90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2fa0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2fb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2fc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2fd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2fe0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2ff0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
3000: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
3010: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
3020: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
3030: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
3040: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
3050: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
3060: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
3070: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
3080: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3090: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
30a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
30b0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
30c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
30d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
30e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
30f0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3100: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3110: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3120: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3130: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3140: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3150: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3160: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3190: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
31a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
31b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
31c0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
31d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
31e0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
31f0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
3200: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
3210: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
3220: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
3230: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
3240: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
3250: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
3260: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
3270: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
3280: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
3290: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
32a0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
32b0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
32c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
32d0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
32e0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
32f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3300: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
3310: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3320: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3330: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3340: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3350: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3360: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3370: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3380: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3390: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
33c0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
33d0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
33e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
3400: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
3410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3420: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3430: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3440: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3450: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3460: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3480: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3490: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
34a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
34b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
34d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
3500: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
3510: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3540: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3550: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3560: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3580: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3590: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
35a0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
35d0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
35e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
35f0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
3600: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
3610: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3640: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3650: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3660: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3670: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3680: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
36a0: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
36b0: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
36c0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
36d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
36e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
36f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3700: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
3710: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
3720: 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
3730: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
3740: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
3750: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3760: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
3770: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3780: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
3790: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
37a0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
37b0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  f index pIdx is 
37c0: 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74  NOT NULL.*/.stat
37d0: 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75  ic int indexColu
37e0: 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20  mnNotNull(Index 
37f0: 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29  *pIdx, int iCol)
3800: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
3810: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
3820: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
3830: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
3840: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d  nColumn );.  j =
3850: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
3860: 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d  iCol];.  if( j>=
3870: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3880: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3890: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20  ol[j].notNull;. 
38a0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d   }else if( j==(-
38b0: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
38c0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
38d0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29   assert( j==(-2)
38e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
38f0: 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20  ;  /* Assume an 
3900: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
3910: 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79 69  on can always yi
3920: 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  eld a NULL */.. 
3930: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3940: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
3950: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
3960: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
3970: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
3980: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
3990: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
39a0: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
39b0: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
39c0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
39d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
39e0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
39f0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
3a00: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
3a10: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
3a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3a30: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
3a40: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
3a50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3a60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3a70: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
3a80: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
3a90: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
3aa0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
3ab0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3ac0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
3ad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
3ae0: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
3af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
3b00: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
3b10: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
3b20: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
3b30: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
3b40: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
3b70: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
3b80: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
3b90: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
3ba0: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
3bb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
3bc0: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
3bd0: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
3be0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
3bf0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
3c00: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
3c10: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
3c20: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
3c30: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
3c40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
3c50: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
3c60: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
3c70: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3c80: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
3c90: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
3ca0: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
3cb0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
3cc0: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
3cd0: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
3ce0: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
3cf0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
3d00: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
3d10: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
3d20: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
3d30: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
3d40: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
3d50: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
3d60: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
3d70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3d80: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
3d90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3da0: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
3db0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3dc0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3dd0: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
3de0: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
3df0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
3e00: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3e10: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
3e20: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
3e30: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
3e40: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
3e50: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
3e60: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
3e70: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
3e80: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
3e90: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
3ea0: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
3eb0: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
3ec0: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
3ed0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
3ee0: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
3ef0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
3f00: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
3f10: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
3f20: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
3f30: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
3f40: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
3f50: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
3f60: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
3f70: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
3f80: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
3f90: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
3fa0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
3fb0: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
3fc0: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
3fd0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
3fe0: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
3ff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
4000: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
4010: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
4020: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
4030: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
4040: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
4050: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
4060: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
4070: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
4080: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
4090: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
40a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
40b0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
40c0: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
40d0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
40e0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
40f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
4100: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4110: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
4120: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
4130: 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69 74   iBase, i, ~(Bit
4140: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
4150: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
4160: 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  if( findIndexCol
4170: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
4180: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
4190: 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   i)<0 ) break;. 
41a0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65 78         if( index
41b0: 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49  ColumnNotNull(pI
41c0: 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65 61  dx, i)==0 ) brea
41d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
41e0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
41f0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
4200: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
4210: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
4220: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4230: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
4240: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
4250: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4260: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4270: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
4280: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
4290: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
42a0: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
42b0: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
42c0: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
42d0: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
42e0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
42f0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
4300: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43  .** Convert OP_C
4310: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f  olumn opcodes to
4320: 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65 76   OP_Copy in prev
4330: 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
4340: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   code..**.** Thi
4350: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f  s routine runs o
4360: 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56 44  ver generated VD
4370: 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61 6e  BE code and tran
4380: 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e  slates OP_Column
4390: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f  .** opcodes into
43a0: 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74 68   OP_Copy when th
43b0: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
43c0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
43d0: 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e 73  -routine .** ins
43e0: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
43f0: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20  e lookup..**.** 
4400: 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77 69  If the bIncrRowi
4410: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
4420: 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f  , then any OP_Ro
4430: 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  wid instructions
4440: 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54   on.** cursor iT
4450: 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66  abCur are transf
4460: 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e 75  ormed into OP_Nu
4470: 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63 72  ll. Or, if bIncr
4480: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
4490: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68 20  o,.** then each 
44a0: 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61 6e  OP_Rowid is tran
44b0: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e 20  sformed into an 
44c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 69  instruction to i
44d0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
44e0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
44f0: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
4500: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4510: 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c  oid translateCol
4520: 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50 61 72  umnToCopy(.  Par
4530: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4540: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4550: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ext */.  int iSt
4560: 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  art,         /* 
4570: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 74  Translate from t
4580: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  his opcode to th
4590: 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  e end */.  int i
45a0: 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20 2f  TabCur,        /
45b0: 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52  * OP_Column/OP_R
45c0: 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73 20  owid references 
45d0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
45e0: 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65 72  .  int iRegister
45f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ,      /* The fi
4600: 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  rst column is in
4610: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4620: 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f 77  /.  int bIncrRow
4630: 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  id      /* If no
4640: 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f 72  n-zero, transfor
4650: 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f 50  m OP_rowid to OP
4660: 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29 7b  _AddImm(1) */.){
4670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64  rse->pVdbe;.  Vd
4690: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
46a0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
46b0: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
46c0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
46d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
46e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
46f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4710: 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69  ; iStart<iEnd; i
4720: 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Start++, pOp++){
4730: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  .    if( pOp->p1
4740: 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  !=iTabCur ) cont
4750: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
4760: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
4770: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f  lumn ){.      pO
4780: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
4790: 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  opy;.      pOp->
47a0: 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69  p1 = pOp->p2 + i
47b0: 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20  Register;.      
47c0: 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70  pOp->p2 = pOp->p
47d0: 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  3;.      pOp->p3
47e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
47f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
4800: 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
4810: 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69     if( bIncrRowi
4820: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
4830: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
4840: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
4850: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4860: 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f  the OP_Rowid. */
4870: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4880: 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d  code = OP_AddImm
4890: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48a0: 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  1 = pOp->p2;.   
48b0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31       pOp->p2 = 1
48c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
48d0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
48e0: 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20  de = OP_Null;.  
48f0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
4900: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  0;.        pOp->
4910: 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  p3 = 0;.      }.
4920: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4930: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
4940: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
4950: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
4960: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
4970: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
4980: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
4990: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
49a0: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
49b0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
49c0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
49d0: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
49e0: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
49f0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
4a00: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
4a10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
4a20: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
4a30: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
4a40: 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
4a50: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
4a60: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
4a70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4a80: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4a90: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4aa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4ab0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4ac0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4ae0: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
4af0: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
4b00: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
4b10: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
4b20: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
4b30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4b40: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
4b50: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4b60: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
4b70: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4b80: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
4b90: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4ba0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
4bb0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4bc0: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
4bd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
4be0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
4bf0: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
4c00: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
4c10: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
4c20: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
4c30: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
4c40: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
4c50: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
4c60: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
4c70: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
4c80: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4c90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4ca0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4cb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4cc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4cd0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ce0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4cf0: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
4d00: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
4d10: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
4d20: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
4d30: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
4d40: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
4d50: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4d60: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
4d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
4d80: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d90: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
4da0: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
4db0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4dc0: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
4dd0: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
4de0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4df0: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
4e00: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
4e10: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
4e20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e30: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
4e40: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
4e50: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
4e60: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e70: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52  tf("  estimatedR
4e80: 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e  ows=%lld\n", p->
4e90: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
4ea0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
4eb0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
4ec0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
4ed0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
4ee0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4ef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4f00: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
4f10: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4f20: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4f30: 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
4f40: 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
4f50: 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
4f60: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
4f70: 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
4f80: 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
4f90: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
4fa0: 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
4fb0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
4fc0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
4fd0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
4fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4ff0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
5000: 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
5010: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5020: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
5030: 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
5040: 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
5050: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
5060: 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
5070: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
5080: 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
5090: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
50a0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
50b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
50c0: 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
50d0: 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
50e0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
50f0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
5100: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65  |WO_IS))==0 ) re
5110: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
5120: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
5130: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
5140: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5150: 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
5160: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
5170: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
5180: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
5190: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
51a0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
51b0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
51c0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
51d0: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
51e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74  return 0;.  test
51f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
5200: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
5210: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5220: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
5230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
5240: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
5250: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5260: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
5270: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
5280: 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
5290: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
52a0: 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
52b0: 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
52c0: 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
52d0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
52e0: 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
52f0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
5300: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
5310: 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
5320: 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
5330: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5350: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
5360: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5370: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
5380: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
5390: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
53a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
53b0: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
53c0: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
53d0: 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
53e0: 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
53f0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
5400: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5410: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
5420: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
5430: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
5440: 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
5450: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
5460: 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
5470: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
5480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5490: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
54a0: 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
54b0: 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
54c0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
54d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
54e0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
54f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5500: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5510: 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
5520: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
5530: 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  a[] */.  Index *
5540: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
5550: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
5560: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
5570: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
5580: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55a0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
55b0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
55c0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
55d0: 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
55e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
55f0: 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
5600: 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
5610: 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
5620: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
5630: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
5640: 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
5650: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  d */.  int addrT
5660: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
5670: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
5680: 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
5690: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
56a0: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
56b0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
56c0: 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
56d0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
56e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5700: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5710: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
5730: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
5740: 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
5750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5760: 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
5770: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
5780: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
5790: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
57a0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
57b0: 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
57c0: 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
57d0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
57e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
57f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
5800: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20  r *zNotUsed;    
5810: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
5820: 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65  a space on the e
5830: 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  nd of pIdx */.  
5840: 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
5850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5860: 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
5870: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
5880: 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
5890: 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
58a0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
58b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
58c0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
58d0: 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
58e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
58f0: 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
5900: 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20  een issued */.  
5910: 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d  Expr *pPartial =
5920: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
5930: 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70  artial Index Exp
5940: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
5950: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20   iContinue = 0; 
5960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
5970: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78   here to skip ex
5980: 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20  cluded rows */. 
5990: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
59a0: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
59b0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
59c0: 74 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78  term being index
59d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
59e0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20  Counter = 0;    
59f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77      /* Address w
5a00: 68 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75  here integer cou
5a10: 6e 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  nter is initiali
5a20: 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zed */.  int reg
5a30: 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
5a40: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
5a50: 20 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65   registers where
5a60: 20 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d   record is assem
5a70: 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  bled */..  /* Ge
5a80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
5a90: 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
5aa0: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
5ab0: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
5ac0: 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
5ad0: 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
5ae0: 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
5af0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
5b00: 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
5b10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
5b20: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
5b30: 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
5b40: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
5b50: 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
5b60: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
5b70: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
5b80: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5b90: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5ba0: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
5bb0: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
5bc0: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
5bd0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
5be0: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
5bf0: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
5c00: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
5c10: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
5c20: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
5c30: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
5c40: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
5c50: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5c60: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
5c70: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
5c80: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
5c90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
5ca0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5cb0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5cc0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a  _FromJoin)    /*
5cd0: 20 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e   prereq always n
5ce0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  on-zero */.     
5cf0: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52      || pExpr->iR
5d00: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
5d10: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f  Src->iCursor   /
5d20: 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68  *   for the righ
5d30: 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20  t-hand   */.    
5d40: 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70       || pLoop->p
5d50: 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20  rereq!=0 );     
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20  /*   table of a 
5d80: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20  LEFT JOIN */.   
5d90: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72   if( pLoop->prer
5da0: 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  eq==0.     && (p
5db0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
5dc0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30  TERM_VIRTUAL)==0
5dd0: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
5de0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5df0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
5e00: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
5e10: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
5e20: 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43  (pExpr, pSrc->iC
5e30: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
5e40: 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74  pPartial = sqlit
5e50: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
5e60: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a  ->db, pPartial,.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5eb0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
5ec0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
5ed0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
5ee0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
5ef0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
5f00: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
5f10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
5f20: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
5f30: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
5f40: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
5f50: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
5f60: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
5f70: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
5f80: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
5f90: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  1 );.      if( !
5fa0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20  sentWarning ){. 
5fb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
5fc0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
5fd0: 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20  G_AUTOINDEX,.   
5fe0: 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61           "automa
5ff0: 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28  tic index on %s(
6000: 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  %s)", pTable->zN
6010: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
6020: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43   pTable->aCol[iC
6030: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
6040: 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20      sentWarning 
6050: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
6060: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
6070: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
6080: 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
6090: 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73  LoopResize(pPars
60a0: 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b  e->db, pLoop, nK
60b0: 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20  eyCol+1) ){.    
60c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
60d0: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
60e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
60f0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
6100: 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70  m[nKeyCol++] = p
6110: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
6120: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
6130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6140: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  }.  assert( nKey
6150: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  Col>0 );.  pLoop
6160: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
6170: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
6180: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70  nKeyCol;.  pLoop
6190: 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
61a0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
61b0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
61c0: 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
61f0: 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
6200: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
6210: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
6220: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
6230: 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
6240: 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
6250: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
6260: 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
6270: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
6280: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
6290: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
62a0: 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
62b0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
62c0: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
62d0: 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
62e0: 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
62f0: 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
6300: 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
6310: 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
6320: 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
6330: 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
6340: 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
6350: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
6360: 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
6370: 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
6380: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
6390: 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
63a0: 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
63b0: 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
63c0: 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
63d0: 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
63e0: 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
63f0: 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
6400: 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54  l = MIN(BMS-1,pT
6410: 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74  able->nCol);.  t
6420: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6430: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
6440: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
6450: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
6460: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6470: 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
6480: 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
6490: 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
64a0: 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a   nKeyCol++;.  }.
64b0: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
64c0: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
64d0: 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79  S-1) ){.    nKey
64e0: 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  Col += pTable->n
64f0: 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
6500: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
6510: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
6520: 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
6530: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
6540: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  pIdx = sqlite3Al
6550: 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
6560: 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  t(pParse->db, nK
6570: 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f  eyCol+1, 0, &zNo
6580: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49  tUsed);.  if( pI
6590: 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  dx==0 ) goto end
65a0: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
65b0: 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  te;.  pLoop->u.b
65c0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
65d0: 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  dx;.  pIdx->zNam
65e0: 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
65f0: 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
6600: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
6610: 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
6620: 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
6630: 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
6640: 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
6650: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
6660: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
6670: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
6680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
6690: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
66a0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
66b0: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
66c0: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
66d0: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
66e0: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
66f0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
6700: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
6710: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6720: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
6730: 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
6740: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
6750: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
6760: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
6770: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
6780: 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
6790: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
67a0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
67b0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
67c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
67d0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
67e0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
67f0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
6800: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6810: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c  zColl[n] = pColl
6820: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
6830: 3a 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  : sqlite3StrBINA
6840: 52 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  RY;.        n++;
6850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
6870: 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  2)n==pLoop->u.bt
6880: 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  ree.nEq );..  /*
6890: 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
68a0: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
68b0: 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
68c0: 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
68d0: 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
68e0: 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
68f0: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
6900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
6910: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
6920: 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  T(i) ){.      pI
6930: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6940: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
6950: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c  >azColl[n] = sql
6960: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
6970: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
6980: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
6990: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
69a0: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
69b0: 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
69c0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
69d0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
69e0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
69f0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
6a00: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6a10: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
6a20: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
6a30: 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79   assert( n==nKey
6a40: 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61  Col );.  pIdx->a
6a50: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f  iColumn[n] = XN_
6a60: 52 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61  ROWID;.  pIdx->a
6a70: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
6a80: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20  e3StrBINARY;..  
6a90: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
6aa0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
6ab0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
6ac0: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
6ad0: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
6ae0: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
6af0: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
6b00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
6b10: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
6b20: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
6b30: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
6b40: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
6b50: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
6b60: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
6b70: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
6b80: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
6b90: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
6ba0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6bb0: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
6bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6bd0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
6be0: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
6bf0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  C->pWInfo->pTabL
6c00: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
6c10: 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61  From];.  if( pTa
6c20: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
6c30: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
6c40: 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
6c50: 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
6c60: 3b 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65  ;.    addrCounte
6c70: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6c80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6c90: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6cb0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
6cc0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
6cd0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
6ce0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
6cf0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
6d00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6d10: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6d20: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6d30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6d40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6d50: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6d60: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6d70: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6d80: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6d90: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6da0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
6db0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
6dc0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
6dd0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
6de0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
6df0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
6e00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6e10: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6e20: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6e30: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6e40: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6e50: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6e60: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6e70: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6e80: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6e90: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6ea0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6eb0: 29 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73  );.  regBase = s
6ec0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
6ed0: 64 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50  dexKey(.      pP
6ee0: 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
6ef0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
6f00: 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
6f10: 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65   0.  );.  sqlite
6f20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6f30: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
6f40: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
6f50: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
6f60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6f70: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
6f80: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20  KRESULT);.  if( 
6f90: 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74  pPartial ) sqlit
6fa0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6fb0: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
6fc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
6fd0: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
6fe0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
6ff0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
7000: 61 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67  addrCounter, reg
7010: 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73  Base+n);.    tes
7020: 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
7030: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7040: 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65  );.    translate
7050: 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61  ColumnToCopy(pPa
7060: 72 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c  rse, addrTop, pL
7070: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
70a0: 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29  m->regResult, 1)
70b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
70c0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
70d0: 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d  );.    pTabItem-
70e0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
70f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7110: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
7120: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7130: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
7140: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7150: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
7160: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
7170: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
7180: 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
7190: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
71a0: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
71b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
71c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
71d0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
71e0: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
71f0: 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20  Parse);.  .  /* 
7200: 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
7210: 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
7220: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
7230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7240: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
7250: 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  ;..end_auto_inde
7260: 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69  x_create:.  sqli
7270: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7280: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
7290: 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  al);.}.#endif /*
72a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
72b0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
72c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
72e0: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
72f0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
7300: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7310: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
7320: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
7330: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
7340: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
7350: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
7360: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
7370: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
7380: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
7390: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
73a0: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
73b0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
73c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
73d0: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
73e0: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
73f0: 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
7400: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74  ause *pWC,.  Bit
7410: 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20  mask mUnusable, 
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7430: 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74  Ignore terms wit
7440: 68 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20  h these prereqs 
7450: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7460: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
7470: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
7480: 65 72 42 79 2c 0a 20 20 75 31 36 20 2a 70 6d 4e  erBy,.  u16 *pmN
7490: 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  oOmit           
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
74b0: 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20  of terms not to 
74c0: 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  omit */.){.  int
74d0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
74e0: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
74f0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7500: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
7510: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7520: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
7530: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
7540: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7550: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7560: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
7570: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7580: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
7590: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
75a0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
75b0: 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  o;.  u16 mNoOmit
75c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e   = 0;..  /* Coun
75d0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
75e0: 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63  possible WHERE c
75f0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
7600: 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a  s referring.  **
7610: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
7620: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
7630: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
7640: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
7650: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
7660: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
7670: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7680: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
76a0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
76b0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
76c0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
76d0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
76e0: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
76f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7700: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7710: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7720: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7730: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7740: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7750: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
7760: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7770: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7780: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
7790: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
77a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
77b0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
77c0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
77d0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
77e0: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
77f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7800: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7810: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7820: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7830: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7840: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7850: 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72  (-1) );.    nTer
7860: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
7870: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7880: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
7890: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
78a0: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
78b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
78c0: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
78d0: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
78e0: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
78f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7900: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7910: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
7920: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
7930: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
7940: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
7950: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
7960: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
7970: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7980: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7990: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
79a0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
79b0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
79c0: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
79d0: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
79e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
79f0: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
7a00: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
7a10: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
7a20: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
7a30: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
7a40: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
7a50: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7a60: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
7a70: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
7a80: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
7ab0: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
7ac0: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
7af0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
7b00: 79 29 2a 6e 4f 72 64 65 72 42 79 20 0a 20 20 20  y)*nOrderBy .   
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 69 66 28          );.  if(
7b30: 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
7b40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7b50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
7b60: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
7b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7b80: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
7b90: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
7ba0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
7bb0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7bc0: 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
7bd0: 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
7be0: 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
7bf0: 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
7c00: 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
7c10: 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
7c20: 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
7c30: 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
7c40: 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
7c50: 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
7c60: 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
7c70: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
7c80: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
7c90: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7ca0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
7cb0: 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
7cc0: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
7cd0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
7ce0: 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
7cf0: 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
7d00: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7d10: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7d20: 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
7d30: 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
7d40: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
7d50: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
7d60: 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
7d70: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
7d80: 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
7d90: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7da0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7db0: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
7dc0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
7dd0: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
7de0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7df0: 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
7e00: 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
7e10: 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
7e20: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
7e30: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7e40: 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
7e50: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
7e60: 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
7eb0: 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
7ec0: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
7ed0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
7ee0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
7ef0: 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
7f00: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
7f10: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
7f20: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
7f30: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
7f40: 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e  rereqRight & mUn
7f50: 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75  usable ) continu
7f60: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
7f70: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
7f80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7f90: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
7fa0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7fb0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7fc0: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
7fd0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7fe0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
7ff0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8000: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8010: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
8020: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
8030: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8040: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
8050: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
8060: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
8070: 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53  L|WO_EQUIV|WO_IS
8080: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
8090: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
80a0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
80b0: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
80c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
80d0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
80e0: 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 70  n>=(-1) );.    p
80f0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
8100: 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
8110: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  ftColumn;.    pI
8120: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
8130: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f  ffset = i;.    o
8140: 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
8150: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
8160: 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  L;.    if( op==W
8170: 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45  O_IN ) op = WO_E
8180: 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  Q;.    if( op==W
8190: 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20  O_MATCH ){.     
81a0: 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61   op = pTerm->eMa
81b0: 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  tchOp;.    }.   
81c0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
81d0: 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
81e0: 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
81f0: 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
8200: 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
8210: 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
8220: 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
8230: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
8240: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
8250: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
8260: 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
8270: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
8280: 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
8290: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
82a0: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
82b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
82c0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
82d0: 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
82e0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
82f0: 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
8300: 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
8310: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8320: 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
8330: 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
8340: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8350: 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
8360: 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
8370: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
8380: 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
8390: 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
83a0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
83b0: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
83c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
83d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
83e0: 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
83f0: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
8400: 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
8410: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 20 26 20  ;..    if( op & 
8420: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  (WO_LT|WO_LE|WO_
8430: 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20 26  GT|WO_GE).     &
8440: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  & sqlite3ExprIsV
8450: 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78  ector(pTerm->pEx
8460: 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20 20 20  pr->pRight) .   
8470: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c   ){.      if( i<
8480: 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20  16 ) mNoOmit |= 
8490: 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20 20  (1 << i);.      
84a0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20  if( op==WO_LT ) 
84b0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
84c0: 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 69 66   WO_LE;.      if
84d0: 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49  ( op==WO_GT ) pI
84e0: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57  dxCons[j].op = W
84f0: 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  O_GE;.    }..   
8500: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
8510: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
8520: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
8530: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
8540: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
8550: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
8560: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
8570: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
8580: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
8590: 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
85a0: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
85b0: 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74    }..  *pmNoOmit
85c0: 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65   = mNoOmit;.  re
85d0: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
85e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
85f0: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
8600: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
8610: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8620: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8630: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
8640: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
8650: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
8660: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
8670: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
8680: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
8690: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
86a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
86b0: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
86c0: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
86d0: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
86e0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
86f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
8700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
8710: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
8720: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
8730: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
8740: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
8750: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
8760: 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
8770: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
8780: 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
8790: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
87a0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
87b0: 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
87c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
87d0: 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
87e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
87f0: 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
8800: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
8810: 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
8820: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
8830: 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
8840: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
8850: 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
8860: 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
8870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8880: 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
8890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
88a0: 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
88b0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
88c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
88d0: 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
88e0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
88f0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
8900: 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tab;.  int rc;..
8910: 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55    TRACE_IDX_INPU
8920: 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56  TS(p);.  rc = pV
8930: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
8940: 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20  estIndex(pVtab, 
8950: 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  p);.  TRACE_IDX_
8960: 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69  OUTPUTS(p);..  i
8970: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8980: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
8990: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
89a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
89b0: 46 61 75 6c 74 28 70 50 61 72 73 65 2d 3e 64 62  Fault(pParse->db
89c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
89d0: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
89e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
89f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8a00: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
8a10: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
8a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8a40: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
8a50: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
8a60: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
8a70: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
8a80: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
8a90: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 23 69 66  ErrMsg = 0;..#if
8aa0: 20 30 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72   0.  /* This err
8ab0: 6f 72 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  or is now caught
8ac0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
8ad0: 20 20 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20    ** Search for 
8ae0: 22 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66  "xBestIndex malf
8af0: 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f 77 20 2a  unction" below *
8b00: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
8b10: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
8b20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
8b30: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
8b40: 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
8b50: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
8b60: 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
8b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8b80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8b90: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
8ba0: 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
8bb0: 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
8bc0: 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
8bd0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
8be0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
8bf0: 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
8c00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
8c10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8c20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
8c30: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
8c40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
8c50: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
8c60: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74  timate the locat
8c70: 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75  ion of a particu
8c80: 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c  lar key among al
8c90: 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20  l keys in an.** 
8ca0: 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68  index.  Store th
8cb0: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74  e results in aSt
8cc0: 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  at as follows:.*
8cd0: 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d  *.**    aStat[0]
8ce0: 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
8cf0: 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74  r of rows less t
8d00: 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61  han pRec.**    a
8d10: 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74  Stat[1]      Est
8d20: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
8d30: 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a   equal to pRec.*
8d40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8d50: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d  index of the sam
8d60: 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20  ple that is the 
8d70: 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  smallest sample 
8d80: 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  that.** is great
8d90: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
8da0: 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74   to pRec. Note t
8db0: 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69  hat this index i
8dc0: 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a  s not an index.*
8dd0: 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70  * into the aSamp
8de0: 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20  le[] array - it 
8df0: 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f  is an index into
8e00: 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f   a virtual set o
8e10: 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73  f samples.** bas
8e20: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
8e30: 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20  ts of aSample[] 
8e40: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
8e50: 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f  f fields in reco
8e60: 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f  rd .** pRec. .*/
8e70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
8e80: 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
8e90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8eb0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
8ec0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
8ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8ee0: 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
8ef0: 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
8f00: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
8f10: 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20  ord *pRec,      
8f20: 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61   /* Vector of va
8f30: 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  lues to consider
8f40: 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
8f50: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8f60: 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
8f70: 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
8f80: 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
8f90: 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fb0: 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
8fc0: 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
8fd0: 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
8fe0: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
8ff0: 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  mple;.  int iCol
9000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9010: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9020: 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69  required stats i
9030: 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f  n anEq[] etc. */
9040: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9060: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
9070: 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20   sample >= pRec 
9080: 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65  */.  int iSample
9090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
90a0: 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
90b0: 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ple larger than 
90c0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
90d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d   */.  int iMin =
90e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
90f0: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
9100: 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73  mple not yet tes
9110: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ted */.  int iTe
9120: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9130: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
9140: 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
9150: 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9170: 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
9180: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
9190: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
91c0: 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20  lds in pRec */. 
91d0: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20   tRowcnt iLower 
91e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
91f0: 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20  anLt[] + anEq[] 
9200: 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c  of largest sampl
9210: 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a  e pRec is > */..
9220: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
9230: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
9240: 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20  RAMETER( pParse 
9250: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
9260: 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20  rt( pRec!=0 );. 
9270: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9280: 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
9290: 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65  sert( pRec->nFie
92a0: 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46  ld>0 && pRec->nF
92b0: 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d  ield<=pIdx->nSam
92c0: 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20  pleCol );..  /* 
92d0: 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  Do a binary sear
92e0: 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66  ch to find the f
92f0: 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61  irst sample grea
9300: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
9310: 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20  l.  ** to pRec. 
9320: 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73  If pRec contains
9330: 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c   a single field,
9340: 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70   the set of samp
9350: 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20  les to search.  
9360: 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65  ** is simply the
9370: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9380: 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73  . If the samples
9390: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f   in aSample[] co
93a0: 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20  ntain more.  ** 
93b0: 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c  than one fields,
93c0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c   all fields foll
93d0: 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  owing the first 
93e0: 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a  are ignored..  *
93f0: 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63  *.  ** If pRec c
9400: 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73  ontains N fields
9410: 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72  , where N is mor
9420: 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e  e than one, then
9430: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a   as well as the.
9440: 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20    ** samples in 
9450: 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63  aSample[] (trunc
9460: 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73  ated to N fields
9470: 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61 6c  ), the search al
9480: 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63  so has to.  ** c
9490: 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65 73  onsider prefixes
94a0: 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65   of those sample
94b0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
94c0: 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73 61  if the set of sa
94d0: 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53  mples.  ** in aS
94e0: 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20  ample is:.  **. 
94f0: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
9500: 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a  0] = (a, 5) .  *
9510: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d  *     aSample[1]
9520: 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a   = (a, 10) .  **
9530: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20       aSample[2] 
9540: 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (b, 5) .  **  
9550: 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20     aSample[3] = 
9560: 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20  (c, 100) .  **  
9570: 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20     aSample[4] = 
9580: 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20  (c, 105).  **.  
9590: 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61 72  ** Then the sear
95a0: 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20  ch space should 
95b0: 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73  ideally be the s
95c0: 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64  amples above and
95d0: 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75   the .  ** uniqu
95e0: 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20  e prefixes [a], 
95f0: 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74  [b] and [c]. But
9600: 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20 68   since that is h
9610: 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c  ard to organize,
9620: 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20   .  ** the code 
9630: 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65  actually searche
9640: 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a  s this set:.  **
9650: 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29  .  **     0: (a)
9660: 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61   .  **     1: (a
9670: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32  , 5) .  **     2
9680: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
9690: 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a      3: (a, 10) .
96a0: 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20    **     4: (b) 
96b0: 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c  .  **     5: (b,
96c0: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a   5) .  **     6:
96d0: 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37   (c) .  **     7
96e0: 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a  : (c, 100) .  **
96f0: 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29       8: (c, 105)
9700: 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c  .  **     9: (c,
9710: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
9720: 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20  For each sample 
9730: 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  in the aSample[]
9740: 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65   array, N sample
9750: 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  s are present in
9760: 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74   the.  ** effect
9770: 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79  ive sample array
9780: 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  . In the above, 
9790: 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20  samples 0 and 1 
97a0: 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20  are based on .  
97b0: 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c  ** sample aSampl
97c0: 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20  e[0]. Samples 2 
97d0: 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65  and 3 on aSample
97e0: 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20  [1] etc..  **.  
97f0: 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65  ** Often, sample
9800: 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b   i of each block
9810: 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65 20   of N effective 
9820: 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31  samples has (i+1
9830: 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45  ) fields..  ** E
9840: 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70  xcept, each samp
9850: 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64  le may be extend
9860: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
9870: 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72 20  t it is greater 
9880: 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75  than or.  ** equ
9890: 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  al to the previo
98a0: 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  us sample in the
98b0: 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d   array. For exam
98c0: 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76  ple, in the abov
98d0: 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20  e, .  ** sample 
98e0: 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  2 is the first s
98f0: 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b  ample of a block
9900: 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73   of N samples, s
9910: 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a 20  o at first it . 
9920: 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61 74   ** appears that
9930: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20   it should be 1 
9940: 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48  field in size. H
9950: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75  owever, that wou
9960: 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a  ld make it .  **
9970: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61   smaller than sa
9980: 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62  mple 1, so the b
9990: 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f 75  inary search wou
99a0: 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20  ld not work. As 
99b0: 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20  a result, .  ** 
99c0: 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20 74  it is extended t
99d0: 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68  o two fields. Th
99e0: 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68 61  e duplicates tha
99f0: 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20 64  t this creates d
9a00: 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73  o not .  ** caus
9a10: 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
9a20: 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20    */.  nField = 
9a30: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  pRec->nField;.  
9a40: 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d  iCol = 0;.  iSam
9a50: 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d  ple = pIdx->nSam
9a60: 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20  ple * nField;.  
9a70: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d  do{.    int iSam
9a80: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9a90: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
9aa0: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74  n aSample[] of t
9ab0: 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20  est sample */.  
9ac0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
9af0: 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70  lds in test samp
9b00: 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74  le */..    iTest
9b10: 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65   = (iMin+iSample
9b20: 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d  )/2;.    iSamp =
9b30: 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b   iTest / nField;
9b40: 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30  .    if( iSamp>0
9b50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
9b60: 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74   proposed effect
9b70: 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20  ive sample is a 
9b80: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
9b90: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9ba0: 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66  .      ** Specif
9bb0: 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72  ically, the shor
9bc0: 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 61  test prefix of a
9bd0: 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65  t least (1 + iTe
9be0: 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20  st%nField) .    
9bf0: 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74    ** fields that
9c00: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
9c10: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 66   the previous ef
9c20: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20  fective sample. 
9c30: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d   */.      for(n=
9c40: 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29  (iTest % nField)
9c50: 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20   + 1; n<nField; 
9c60: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  n++){.        if
9c70: 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d  ( aSample[iSamp-
9c80: 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53  1].anLt[n-1]!=aS
9c90: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9ca0: 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a  t[n-1] ) break;.
9cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
9cc0: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65  e{.      n = iTe
9cd0: 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  st + 1;.    }.. 
9ce0: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
9cf0: 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73  = n;.    res = s
9d00: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9d10: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9d20: 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c  iSamp].n, aSampl
9d30: 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63  e[iSamp].p, pRec
9d40: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  );.    if( res<0
9d50: 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
9d60: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   = aSample[iSamp
9d70: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53  ].anLt[n-1] + aS
9d80: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45  ample[iSamp].anE
9d90: 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  q[n-1];.      iM
9da0: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
9db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d    }else if( res=
9dc0: 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29  =0 && n<nField )
9dd0: 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
9de0: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9df0: 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20  anLt[n-1];.     
9e00: 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b   iMin = iTest+1;
9e10: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b  .      res = -1;
9e20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9e30: 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73    iSample = iTes
9e40: 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  t;.      iCol = 
9e50: 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  n-1;.    }.  }wh
9e60: 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e  ile( res && iMin
9e70: 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20  <iSample );.  i 
9e80: 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65  = iSample / nFie
9e90: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
9ea0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
9eb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
9ec0: 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
9ed0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
9ee0: 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
9ef0: 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
9f00: 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
9f10: 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
9f20: 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
9f30: 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
9f40: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
9f50: 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
9f60: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9f70: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
9f80: 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
9f90: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72  {.      /* If (r
9fa0: 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20  es==0) is true, 
9fb0: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62  then pRec must b
9fc0: 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  e equal to sampl
9fd0: 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  e i. */.      as
9fe0: 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
9ff0: 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61  ample );.      a
a000: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
a010: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  eld-1 );.      p
a020: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
a030: 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65  ield;.      asse
a040: 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64  rt( 0==sqlite3Vd
a050: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
a060: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
a070: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
a080: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a090: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a0a0: 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20  locFailed .     
a0b0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
a0c0: 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69       /* Unless i
a0d0: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
a0e0: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
a0f0: 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72 20   pRec is larger 
a100: 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c  than.      ** al
a110: 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  l samples in the
a120: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
a130: 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73  , pRec must be s
a140: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a  maller than the.
a150: 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31        ** (iCol+1
a160: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
a170: 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a  f sample i.  */.
a180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
a190: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26  =pIdx->nSample &
a1a0: 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  & i>=0 );.      
a1b0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69  pRec->nField = i
a1c0: 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  Col+1;.      ass
a1d0: 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
a1e0: 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
a1f0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
a200: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
a210: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
a220: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e  ple[i].p, pRec)>
a230: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
a240: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
a250: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20  ocFailed );..   
a260: 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e     /* if i==0 an
a270: 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20  d iCol==0, then 
a280: 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 73  record pRec is s
a290: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20  maller than all 
a2a0: 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a  samples.      **
a2b0: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
a2c0: 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  ] array. Otherwi
a2d0: 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20  se, if (iCol>0) 
a2e0: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20  then pRec must. 
a2f0: 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74       ** be great
a300: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
a310: 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66   to the (iCol) f
a320: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
a330: 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a  ample i..      *
a340: 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e  * If (i>0), then
a350: 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20   pRec must also 
a360: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
a370: 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a  sample (i-1).  *
a380: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  /.      if( iCol
a390: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  >0 ){.        pR
a3a0: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f  ec->nField = iCo
a3b0: 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
a3c0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  t( sqlite3VdbeRe
a3d0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
a3e0: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
a3f0: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30  e[i].p, pRec)<=0
a400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a410: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a420: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a430: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
a440: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  >0 ){.        pR
a450: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
a460: 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eld;.        ass
a470: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
a480: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
a490: 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
a4a0: 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
a4b0: 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20  ec)<0.          
a4c0: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
a4d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a4f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
a500: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a510: 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d   */..  if( res==
a520: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f  0 ){.    /* Reco
a530: 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61 6c  rd pRec is equal
a540: 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a   to sample i */.
a550: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
a560: 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20  ==nField-1 );.  
a570: 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61    aStat[0] = aSa
a580: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
a590: 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  l];.    aStat[1]
a5a0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
a5b0: 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73  Eq[iCol];.  }els
a5c0: 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  e{.    /* At thi
a5d0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43  s point, the (iC
a5e0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
a5f0: 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d  ix of aSample[i]
a600: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a 20   is the first . 
a610: 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61     ** sample tha
a620: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
a630: 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69  n pRec. Or, if i
a640: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
a650: 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a  then pRec.    **
a660: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
a670: 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74  all samples in t
a680: 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  he array. */.   
a690: 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c   tRowcnt iUpper,
a6a0: 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69   iGap;.    if( i
a6b0: 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
a6c0: 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  ){.      iUpper 
a6d0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
a6e0: 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77  oInt(pIdx->aiRow
a6f0: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  LogEst[0]);.    
a700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
a710: 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  per = aSample[i]
a720: 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
a730: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77   }..    if( iLow
a740: 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
a750: 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
a760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a770: 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
a780: 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
a790: 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
a7a0: 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
a7b0: 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
a7c0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
a7d0: 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
a7e0: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
a7f0: 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20  ower + iGap;.   
a800: 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
a810: 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a  ->aAvgEq[iCol];.
a820: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72    }..  /* Restor
a830: 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65  e the pRec->nFie
a840: 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ld value before 
a850: 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20  returning.  */. 
a860: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
a870: 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e  nField;.  return
a880: 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   i;.}.#endif /* 
a890: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
a8a0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
a8b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
a8c0: 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20  not NULL, pTerm 
a8d0: 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70  is a term that p
a8e0: 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72  rovides an upper
a8f0: 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75   or lower.** bou
a900: 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63  nd on a range sc
a910: 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73  an. Without cons
a920: 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69  idering pTerm, i
a930: 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a  t is estimated .
a940: 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
a950: 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77   will visit nNew
a960: 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63   rows. This func
a970: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
a980: 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d   number.** estim
a990: 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  ated to be visit
a9a0: 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20  ed after taking 
a9b0: 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75  pTerm into accou
a9c0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
a9d0: 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79   user explicitly
a9e0: 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b   specified a lik
a9f0: 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20  elihood() value 
aa00: 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a  for this term,.*
aa10: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
aa20: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c  n value is the l
aa30: 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70  ikelihood multip
aa40: 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  lied by the numb
aa50: 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72  er of.** input r
aa60: 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ows. Otherwise, 
aa70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
aa80: 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49  sumes that an "I
aa90: 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d  S NOT NULL" term
aaa0: 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69  .** has a likeli
aab0: 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e  hood of 0.50, an
aac0: 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d  d any other term
aad0: 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
aae0: 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63   0.25..*/.static
aaf0: 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e   LogEst whereRan
ab00: 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65  geAdjust(WhereTe
ab10: 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73  rm *pTerm, LogEs
ab20: 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73  t nNew){.  LogEs
ab30: 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  t nRet = nNew;. 
ab40: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
ab50: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
ab60: 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20  thProb<=0 ){.   
ab70: 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d     nRet += pTerm
ab80: 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
ab90: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
aba0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
abb0: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
abc0: 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b       nRet -= 20;
abd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abe0: 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
abf0: 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t(4) );.    }.  
ac00: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
ac10: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
ac20: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ac30: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52  OR_STAT4./*.** R
ac40: 65 74 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69  eturn the affini
ac50: 74 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ty for a single 
ac60: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
ac70: 65 78 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ex..*/.char sqli
ac80: 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66  te3IndexColumnAf
ac90: 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20 2a  finity(sqlite3 *
aca0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  db, Index *pIdx,
acb0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73   int iCol){.  as
acc0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
acd0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
ace0: 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21 70 49  umn );.  if( !pI
acf0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20  dx->zColAff ){. 
ad00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
ad10: 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 64  dexAffinityStr(d
ad20: 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20 72 65  b, pIdx)==0 ) re
ad30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
ad40: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
ad50: 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  rn pIdx->zColAff
ad60: 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66  [iCol];.}.#endif
ad70: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
ad80: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
ad90: 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68  _STAT4./* .** Th
ada0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
adb0: 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74  alled to estimat
adc0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
add0: 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
ade0: 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20  a.** range-scan 
adf0: 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  on a skip-scan i
ae00: 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ndex. For exampl
ae10: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  e:.**.**   CREAT
ae20: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
ae30: 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20  (a, b, c);.**   
ae40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
ae50: 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63   WHERE a=? AND c
ae60: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
ae70: 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c  ;.**.** Value pL
ae80: 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72  oop->nOut is cur
ae90: 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
aea0: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
aeb0: 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76  er of rows .** v
aec0: 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e  isited for scann
aed0: 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f  ing (a=? AND b=?
aee0: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
aef0: 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73   reduces that es
af00: 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f  timate .** by so
af10: 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63  me factor to acc
af20: 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20  ount for the (c 
af30: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29  BETWEEN ? AND ?)
af40: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65   expression base
af50: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74  d.** on the stat
af60: 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  4 data for the i
af70: 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20  ndex. this scan 
af80: 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64  will be peformed
af90: 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
afa0: 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61  mes (once for ea
afb0: 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61  ch (a,b) combina
afc0: 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65  tion that matche
afd0: 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20  s a=?) is dealt 
afe0: 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20  with .** by the 
aff0: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  caller..**.** It
b000: 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63   does this by sc
b010: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
b020: 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73  ll stat4 samples
b030: 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75  , comparing valu
b040: 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  es.** extracted 
b050: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
b060: 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20  pUpper with the 
b070: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
b080: 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20  lumn in each.** 
b090: 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64  sample. If L and
b0a0: 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65   U are the numbe
b0b0: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75  r of samples fou
b0c0: 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  nd to be less th
b0d0: 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74  an or.** equal t
b0e0: 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74  o the values ext
b0f0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
b100: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
b110: 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a  spectively, and.
b120: 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61  ** N is the tota
b130: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  l number of samp
b140: 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e  les, the pLoop->
b150: 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64  nOut value is ad
b160: 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c  justed.** as fol
b170: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f  lows:.**.**   nO
b180: 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69  ut = nOut * ( mi
b190: 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20  n(U - L, 1) / N 
b1a0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65  ).**.** If pLowe
b1b0: 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
b1c0: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
b1d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
b1e0: 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a  he term, L is.**
b1f0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66   set to zero. If
b200: 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c   pUpper is NULL,
b210: 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
b220: 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
b230: 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73  from it,.** U is
b240: 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a   set to N..**.**
b250: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
b260: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
b270: 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72  bDone to 1 befor
b280: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77  e returning. How
b290: 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76  ever,.** if no v
b2a0: 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72  alue can be extr
b2b0: 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65  acted from eithe
b2c0: 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70  r pLower or pUpp
b2d0: 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a  er (and so the.*
b2e0: 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  * estimate of th
b2f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b300: 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69   delivered remai
b310: 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a  ns unchanged), *
b320: 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66  pbDone.** is lef
b330: 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49  t as is..**.** I
b340: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b350: 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
b360: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
b370: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
b380: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
b390: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
b3a0: 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
b3b0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
b3c0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
b3d0: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
b3e0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
b3f0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
b400: 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
b410: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
b420: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
b430: 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
b440: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
b450: 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
b460: 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
b470: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
b480: 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
b490: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
b4a0: 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55   *pLoop,    /* U
b4b0: 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20  pdate the .nOut 
b4c0: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f  value of this lo
b4d0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  op */.  int *pbD
b4e0: 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  one          /* 
b4f0: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
b500: 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72  t least one expr
b510: 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  . value extracte
b520: 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  d */.){.  Index 
b530: 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
b540: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
b550: 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
b560: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71  .btree.nEq;.  sq
b570: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b580: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c  se->db;.  int nL
b590: 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  ower = -1;.  int
b5a0: 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61   nUpper = p->nSa
b5b0: 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63  mple+1;.  int rc
b5c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b5d0: 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  u8 aff = sqlite3
b5e0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e  IndexColumnAffin
b5f0: 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b  ity(db, p, nEq);
b600: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
b610: 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  l;.  .  sqlite3_
b620: 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20  value *p1 = 0;  
b630: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
b640: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b650: 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69  pLower */.  sqli
b660: 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20  te3_value *p2 = 
b670: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
b680: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
b690: 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20  rom pUpper */.  
b6a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
b6b0: 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Val = 0;        
b6c0: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
b6d0: 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a  ed from record *
b6e0: 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  /..  pColl = sql
b6f0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
b700: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43  q(pParse, p->azC
b710: 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28  oll[nEq]);.  if(
b720: 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72   pLower ){.    r
b730: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
b740: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
b750: 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45  arse, pLower->pE
b760: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
b770: 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77  , &p1);.    nLow
b780: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  er = 0;.  }.  if
b790: 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d  ( pUpper && rc==
b7a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b7b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
b7c0: 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
b7d0: 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e  pParse, pUpper->
b7e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
b7f0: 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55  ff, &p2);.    nU
b800: 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20  pper = p2 ? 0 : 
b810: 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a  p->nSample;.  }.
b820: 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20  .  if( p1 || p2 
b830: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
b840: 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20    int nDiff;.   
b850: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
b860: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e  LITE_OK && i<p->
b870: 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
b880: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b890: 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c  3Stat4Column(db,
b8a0: 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70   p->aSample[i].p
b8b0: 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
b8c0: 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a  n, nEq, &pVal);.
b8d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b8e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b  LITE_OK && p1 ){
b8f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
b900: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
b910: 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70  pare(p1, pVal, p
b920: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
b930: 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77  f( res>=0 ) nLow
b940: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b950: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b960: 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20  TE_OK && p2 ){. 
b970: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
b980: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
b990: 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f  re(p2, pVal, pCo
b9a0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
b9b0: 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72   res>=0 ) nUpper
b9c0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
b9d0: 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e  }.    nDiff = (n
b9e0: 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b  Upper - nLower);
b9f0: 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d  .    if( nDiff<=
ba00: 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a  0 ) nDiff = 1;..
ba10: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
ba20: 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
ba30: 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
ba40: 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20   specified, and 
ba50: 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  the .    ** comp
ba60: 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65  arisons indicate
ba70: 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
ba80: 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75  lose together, u
ba90: 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a  se the fallback.
baa0: 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61      ** method (a
bab0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
bac0: 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20  can visits 1/64 
bad0: 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72  of the rows) for
bae0: 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20   estimating.    
baf0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
bb00: 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f   rows visited. O
bb10: 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61  therwise, estima
bb20: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
bb30: 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69   rows.    ** usi
bb40: 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  ng the method de
bb50: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 68  scribed in the h
bb60: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f  eader comment fo
bb70: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
bb80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66   */.    if( nDif
bb90: 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d  f!=1 || pUpper==
bba0: 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29  0 || pLower==0 )
bbb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a  {.      int nAdj
bbc0: 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f  ust = (sqlite3Lo
bbd0: 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29  gEst(p->nSample)
bbe0: 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   - sqlite3LogEst
bbf0: 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20  (nDiff));.      
bc00: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e  pLoop->nOut -= n
bc10: 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70  Adjust;.      *p
bc20: 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
bc30: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
bc40: 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73  , ("range skip-s
bc50: 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e  can regions: %u.
bc60: 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65  .%u  adjust=%d e
bc70: 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70       nLower, nUp
bca0: 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c  per, nAdjust*-1,
bcb0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a   pLoop->nOut));.
bcc0: 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
bcd0: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62 44      assert( *pbD
bce0: 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  one==0 );.  }.. 
bcf0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
bd00: 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p1);.  sqlite3
bd10: 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20  ValueFree(p2);. 
bd20: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
bd30: 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
bd40: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
bd50: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
bd60: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
bd70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
bd80: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
bd90: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
bda0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
bdb0: 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
bdc0: 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
bdd0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
bde0: 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
bdf0: 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
be00: 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
be10: 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
be20: 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
be30: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
be40: 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
be50: 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
be60: 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
be70: 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
be80: 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
be90: 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
bea0: 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
beb0: 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
bec0: 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
bed0: 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
bee0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
bef0: 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
bf00: 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
bf10: 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
bf20: 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
bf50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bf60: 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
bf70: 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
bf80: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
bf90: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
bfa0: 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
bfb0: 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
bfc0: 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
bfd0: 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
bfe0: 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
bff0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
c000: 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
c010: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
c020: 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62  nEq) is the numb
c030: 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  er of the index.
c040: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ** column subjec
c050: 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63  t to the range c
c060: 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
c070: 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
c080: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71   number of.** eq
c090: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
c0a0: 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ts optimized by 
c0b0: 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
c0c0: 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
c0d0: 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e  mple,.** assumin
c0e0: 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  g index p is on 
c0f0: 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
c100: 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
c110: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
c120: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
c130: 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
c140: 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
c150: 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
c160: 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
c170: 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
c180: 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65  mn, b, is the se
c190: 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  cond .** left-mo
c1a0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
c1b0: 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
c1c0: 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
c1d0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
c1e0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
c1f0: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
c200: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
c210: 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  t to 0..**.** Wh
c220: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c230: 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f   is called, *pnO
c240: 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
c250: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29   sqlite3LogEst()
c260: 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
c270: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74  r of rows that t
c280: 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  he index scan is
c290: 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
c2a0: 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63  it without .** c
c2b0: 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72  onsidering the r
c2c0: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
c2d0: 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74  . If nEq is 0, t
c2e0: 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68  hen *pnOut is th
c2f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
c300: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
c310: 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  x. Assuming no e
c320: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e  rror occurs, *pn
c330: 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20  Out is adjusted 
c340: 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20  (reduced).** to 
c350: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
c360: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
c370: 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
c380: 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
c390: 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
c3a0: 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
c3b0: 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
c3c0: 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
c3d0: 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69  be.** used, a si
c3e0: 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75  ngle range inequ
c3f0: 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
c400: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
c410: 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e  y a factor of 4.
c420: 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20   .** and a pair 
c430: 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  of constraints (
c440: 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64  x>? AND x<?) red
c450: 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65  uces the expecte
c460: 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72  d number of.** r
c470: 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61  ows visited by a
c480: 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a   factor of 64..*
c490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
c4a0: 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
c4b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c4c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c4d0: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
c4e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c4f0: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
c500: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57  r *pBuilder,.  W
c510: 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
c520: 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
c530: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
c540: 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
c550: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c560: 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
c570: 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
c580: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
c590: 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
c5a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c5b0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
c5c0: 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20  p     /* Modify 
c5d0: 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61  the .nOut and ma
c5e0: 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73  ybe .rRun fields
c5f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
c600: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c610: 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d  nt nOut = pLoop-
c620: 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20  >nOut;.  LogEst 
c630: 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
c640: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
c650: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64  3_OR_STAT4.  Ind
c660: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
c670: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
c680: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
c690: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a  ->u.btree.nEq;..
c6a0: 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
c6b0: 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61  >0 && nEq<p->nSa
c6c0: 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69  mpleCol ){.    i
c6d0: 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  f( nEq==pBuilder
c6e0: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20  ->nRecValid ){. 
c6f0: 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63       UnpackedRec
c700: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
c710: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
c720: 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
c730: 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d        int nBtm =
c740: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
c750: 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nBtm;.      int 
c760: 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  nTop = pLoop->u.
c770: 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20  btree.nTop;..   
c780: 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
c790: 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65  Lower will be se
c7a0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
c7b0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
c7c0: 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20  of rows in .    
c7d0: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
c7e0: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
c7f0: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
c800: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
c810: 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20  uery. The.      
c820: 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62  ** lower bound b
c830: 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65  eing the concate
c840: 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64  nation of $P and
c850: 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73   $L, where $P is
c860: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65   the.      ** ke
c870: 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20  y-prefix formed 
c880: 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  by the nEq value
c890: 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  s matched agains
c8a0: 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d  t the nEq left-m
c8b0: 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ost.      ** col
c8c0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
c8d0: 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65  x, and $L is the
c8e0: 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72   value in pLower
c8f0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c900: 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
c910: 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
c920: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
c930: 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
c940: 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a  ause it.      **
c950: 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
c960: 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74   variable or lit
c970: 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65  eral value), the
c980: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
c990: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e  the.      ** ran
c9a0: 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f  ge is $P. Due to
c9b0: 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20   a quirk in the 
c9c0: 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74  way whereKeyStat
c9d0: 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a  s() works, even.
c9e0: 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69        ** if $L i
c9f0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
ca00: 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
ca10: 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
ca20: 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20  ($P) and .      
ca30: 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74  ** ($P:$L) and t
ca40: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
ca50: 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61   two returned va
ca60: 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20  lues is used..  
ca70: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ca80: 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
ca90: 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
caa0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
cab0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
cac0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  rows.      ** le
cad0: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
cae0: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
caf0: 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
cb00: 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
cb10: 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  d.      ** is ei
cb20: 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50  ther ($P) or ($P
cb30: 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65  :$U). Again, eve
cb40: 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c  n if $U is avail
cb50: 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65  able, both value
cb60: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55  s.      ** of iU
cb70: 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74  pper are request
cb80: 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74  ed of whereKeySt
cb90: 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d  ats() and the sm
cba0: 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20  aller used..    
cbb0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
cbc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
cbd0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
cbe0: 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20   bounds is then 
cbf0: 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77  just iUpper-iLow
cc00: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
cc10: 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
cc20: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
cc30: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
cc40: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
cc50: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
cc60: 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65  ;     /* Rows le
cc70: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
cc80: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
cc90: 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d   int iLwrIdx = -
cca0: 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  2;   /* aSample[
ccb0: 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20  ] for the lower 
ccc0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
ccd0: 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b  nt iUprIdx = -1;
cce0: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
ccf0: 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62 6f  for the upper bo
cd00: 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  und */..      if
cd10: 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20  ( pRec ){.      
cd20: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63    testcase( pRec
cd30: 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64  ->nField!=pBuild
cd40: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b  er->nRecValid );
cd50: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
cd60: 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72  Field = pBuilder
cd70: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20  ->nRecValid;.   
cd80: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
cd90: 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
cda0: 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
cdb0: 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
cdc0: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
cdd0: 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
cde0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
cdf0: 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
ce00: 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
ce10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
ce20: 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
ce30: 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
ce40: 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
ce50: 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
ce60: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
ce70: 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
ce80: 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
ce90: 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
cea0: 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
ceb0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
cec0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
ced0: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
cee0: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
cef0: 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
cf00: 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
cf10: 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
cf20: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
cf30: 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
cf40: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
cf50: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
cf60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cf70: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
cf80: 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
cf90: 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
cfa0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
cfb0: 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
cfc0: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
cfd0: 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
cfe0: 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
cff0: 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
d000: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
d010: 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
d020: 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
d030: 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
d040: 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
d050: 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
d060: 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e       SWAP(int, n
d070: 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20  Btm, nTop);.    
d080: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
d090: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
d0a0: 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
d0b0: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
d0c0: 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
d0d0: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
d0e0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20          int n;  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72    /* Values extr
d110: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
d120: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
d130: 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
d140: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
d150: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d160: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
d170: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
d180: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
d190: 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b   nBtm, nEq, &n);
d1a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
d1b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20  =SQLITE_OK && n 
d1c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
d1d0: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
d1e0: 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20       u16 mask = 
d1f0: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_GT|WO_LE;.   
d200: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
d210: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d220: 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b  (pExpr)>n ) mask
d230: 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29   = (WO_LE|WO_LT)
d240: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72  ;.          iLwr
d250: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
d260: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
d270: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
d280: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
d290: 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
d2a0: 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20  perator & mask) 
d2b0: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
d2c0: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
d2d0: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
d2e0: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
d2f0: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
d300: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
d310: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d320: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
d330: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
d340: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
d350: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
d360: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
d370: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
d380: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
d3b0: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
d3c0: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
d3d0: 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
d3e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
d3f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d400: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
d410: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
d420: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
d430: 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Top, nEq, &n);. 
d440: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
d450: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
d460: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
d470: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
d480: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
d490: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
d4a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d4b0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d4c0: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
d4d0: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
d4e0: 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
d4f0: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
d500: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
d510: 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
d520: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
d530: 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
d540: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
d550: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d560: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
d570: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
d580: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d590: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d5a0: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
d5b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d5c0: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
d5d0: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
d5e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d5f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d600: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
d610: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
d620: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
d630: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
d640: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
d650: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
d660: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
d670: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
d680: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
d690: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
d6a0: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
d6b0: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
d6c0: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
d6d0: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
d6e0: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
d6f0: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
d700: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
d710: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
d720: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
d730: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
d740: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
d750: 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73  f STAT3/4 tables
d760: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
d770: 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72  f( iLwrIdx==iUpr
d780: 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30  Idx ) nNew -= 20
d790: 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73  ;  assert( 20==s
d7a0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
d7b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d7c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
d7d0: 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
d7e0: 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
d7f0: 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
d800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d810: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
d820: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
d830: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
d840: 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  }.        WHERET
d850: 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41  RACE(0x10, ("STA
d860: 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25  T4 range scan: %
d870: 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
d880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
d8a0: 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
d8b0: 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
d8c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d8d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e  {.      int bDon
d8e0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
d8f0: 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  = whereRangeSkip
d900: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
d910: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20  pLower, pUpper, 
d920: 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a  pLoop, &bDone);.
d930: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20        if( bDone 
d940: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d950: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
d960: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d970: 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
d980: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
d990: 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  lder);.  assert(
d9a0: 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
d9b0: 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  r );.#endif.  as
d9c0: 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
d9d0: 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c  || (pUpper->wtFl
d9e0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
d9f0: 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d  )==0 );.  nNew =
da00: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
da10: 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b  t(pLower, nOut);
da20: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
da30: 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65  angeAdjust(pUppe
da40: 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20  r, nNew);..  /* 
da50: 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
da60: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
da70: 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69  r and lower limi
da80: 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69  t and neither li
da90: 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20  mit.  ** has an 
daa0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
dab0: 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  ned likelihood()
dac0: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e  , assume the ran
dad0: 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63  ge is.  ** reduc
dae0: 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ed by an additio
daf0: 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65  nal 75%. This me
db00: 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66  ans that, by def
db10: 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e  ault, an open-en
db20: 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71  ded.  ** range q
db30: 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e  uery (e.g. col >
db40: 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74   ?) is assumed t
db50: 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74  o match 1/4 of t
db60: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  he rows in the. 
db70: 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65   ** index. While
db80: 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20   a closed range 
db90: 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45  (e.g. col BETWEE
dba0: 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73  N ? AND ?) is es
dbb0: 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  timated to.  ** 
dbc0: 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68  match 1/64 of th
dbd0: 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69  e index. */ .  i
dbe0: 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f  f( pLower && pLo
dbf0: 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  wer->truthProb>0
dc00: 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55   && pUpper && pU
dc10: 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  pper->truthProb>
dc20: 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
dc30: 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74   20;.  }..  nOut
dc40: 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20   -= (pLower!=0) 
dc50: 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20  + (pUpper!=0);. 
dc60: 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e   if( nNew<10 ) n
dc70: 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20  New = 10;.  if( 
dc80: 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74  nNew<nOut ) nOut
dc90: 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66   = nNew;.#if def
dca0: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
dcb0: 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70  ENABLED).  if( p
dcc0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  Loop->nOut>nOut 
dcd0: 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
dce0: 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73  E(0x10,("Range s
dcf0: 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20  can lowers nOut 
dd00: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
dd10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd20: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
dd30: 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23  t, nOut));.  }.#
dd40: 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  endif.  pLoop->n
dd50: 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
dd60: 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
dd70: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
dd80: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
dd90: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
dda0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
ddb0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
ddc0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
ddd0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
dde0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
ddf0: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
de00: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
de10: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
de20: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
de30: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
de40: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
de50: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
de60: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
de70: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
de80: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
de90: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
dea0: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
deb0: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
dec0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
ded0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
dee0: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
def0: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
df00: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
df10: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
df20: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
df30: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
df40: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
df50: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
df60: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
df70: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
df80: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
df90: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
dfa0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
dfb0: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
dfc0: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
dfd0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
dfe0: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
dff0: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
e000: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
e010: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
e020: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
e030: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
e040: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
e050: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
e060: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
e070: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
e080: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
e090: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
e0a0: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
e0b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e0c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e0d0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e0e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e0f0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e100: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
e110: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
e120: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
e130: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
e140: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
e150: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
e160: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
e170: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
e180: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
e190: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
e1a0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
e1b0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
e1c0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
e1d0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
e1e0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
e1f0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
e200: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
e210: 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b  >pRec;.  int rc;
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
e240: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
e250: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e270: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
e280: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
e290: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
e2a0: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
e2b0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
e2c0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
e2d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e2e0: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
e2f0: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
e300: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
e310: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
e320: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
e330: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
e340: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
e350: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
e360: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
e370: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
e380: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
e390: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
e3a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
e3b0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
e3c0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
e3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
e3e0: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
e3f0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
e400: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
e410: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
e420: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
e430: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
e440: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
e450: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
e460: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
e470: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
e480: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
e490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e4a0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
e4b0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
e4c0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
e4d0: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
e4e0: 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  1, nEq-1, &bOk);
e4f0: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
e500: 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
e510: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e520: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
e530: 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
e540: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
e550: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
e560: 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
e570: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
e580: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
e590: 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
e5a0: 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
e5b0: 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
e5c0: 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c  s %s(%d): %d\n",
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e5e0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45      p->zName, nE
e5f0: 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  q-1, (int)a[1]))
e600: 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31  ;.  *pnRow = a[1
e610: 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  ];.  .  return r
e620: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
e630: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
e640: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
e650: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e660: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
e670: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
e680: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
e690: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
e6a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
e6b0: 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f  d on.** an IN co
e6c0: 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74  nstraint where t
e6d0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
e6e0: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
e6f0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69  rator.** is a li
e700: 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45  st of values.  E
e710: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
e720: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
e730: 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20  (1,2,3,4).**.** 
e740: 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
e750: 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
e760: 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
e770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
e780: 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
e790: 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
e7a0: 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
e7b0: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
e7c0: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
e7d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e7e0: 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
e7f0: 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
e800: 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
e810: 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
e820: 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
e830: 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
e840: 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
e850: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
e860: 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
e870: 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
e880: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
e890: 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
e8a0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
e8b0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
e8c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
e8d0: 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20  ereInScanEst(.  
e8e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e8f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e900: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
e910: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
e920: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
e930: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
e940: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e950: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c    /* The value l
e960: 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ist on the RHS o
e970: 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76  f "x IN (v1,v2,v
e980: 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f  3,...)" */.  tRo
e990: 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
e9a0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
e9b0: 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
e9c0: 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
e9d0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
e9e0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
e9f0: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36  ree.pIndex;.  i6
ea00: 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65  4 nRow0 = sqlite
ea10: 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e  3LogEstToInt(p->
ea20: 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b  aiRowLogEst[0]);
ea30: 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64  .  int nRecValid
ea40: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
ea50: 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63  cValid;.  int rc
ea60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
ea70: 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
ea80: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
ea90: 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
eaa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
eab0: 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
eac0: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
ead0: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
eae0: 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
eaf0: 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
eb00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
eb10: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eb30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
eb40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
eb50: 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
eb60: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
eb70: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
eb80: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
eb90: 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b     nEst = nRow0;
eba0: 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45  .    rc = whereE
ebb0: 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
ebc0: 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c  se, pBuilder, pL
ebd0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
ebe0: 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f   &nEst);.    nRo
ebf0: 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20  wEst += nEst;.  
ec00: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
ec10: 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
ec20: 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  d;.  }..  if( rc
ec30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ec40: 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
ec50: 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74   nRow0 ) nRowEst
ec60: 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70   = nRow0;.    *p
ec70: 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
ec80: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
ec90: 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  x10,("IN row est
eca0: 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22  imate: est=%d\n"
ecb0: 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
ecc0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
ecd0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
ece0: 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
ecf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ed00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
ed10: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
ed20: 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57  T4 */...#ifdef W
ed30: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
ed40: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  D./*.** Print th
ed50: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
ed60: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a  hereTerm object.
ed70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ed80: 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68  hereTermPrint(Wh
ed90: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
eda0: 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66  int iTerm){.  if
edb0: 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ( pTerm==0 ){.  
edc0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
edd0: 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20  intf("TERM-%-3d 
ede0: 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b  NULL\n", iTerm);
edf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
ee00: 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20  ar zType[4];.   
ee10: 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b   char zLeft[50];
ee20: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
ee30: 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
ee40: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
ee50: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
ee60: 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
ee70: 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
ee80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
ee90: 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
eea0: 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
eeb0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
eec0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
eed0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
eee0: 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
eef0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
ef00: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
ef10: 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20  SINGLE ){.      
ef20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ef30: 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a  (sizeof(zLeft),z
ef40: 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25  Left,"left={%d:%
ef50: 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72              pTer
ef70: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70  m->leftCursor, p
ef80: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
ef90: 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  mn);.    }else i
efa0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
efb0: 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
efc0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   && pTerm->u.pOr
efd0: 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20  Info!=0 ){.     
efe0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
eff0: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
f000: 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65  zLeft,"indexable
f010: 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20  =0x%lld", .     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
f040: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a  fo->indexable);.
f050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f060: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f070: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
f080: 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c  zLeft,"left=%d",
f090: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
f0a0: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  or);.    }.    s
f0b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f0c0: 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d  f(.       "TERM-
f0d0: 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31 32 73  %-3d %p %s %-12s
f0e0: 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78   prob=%-3d op=0x
f0f0: 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25  %03x wtFlags=0x%
f100: 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65  04x",.       iTe
f110: 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65  rm, pTerm, zType
f120: 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e  , zLeft, pTerm->
f130: 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20  truthProb,.     
f140: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
f150: 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  or, pTerm->wtFla
f160: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  gs);.    if( pTe
f170: 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20  rm->iField ){.  
f180: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f190: 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d  Printf(" iField=
f1a0: 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46  %d\n", pTerm->iF
f1b0: 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ield);.    }else
f1c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f1d0: 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
f1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f1f0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
f200: 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  0, pTerm->pExpr,
f210: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   0);.  }.}.#endi
f220: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
f230: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
f240: 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70  ** Show the comp
f250: 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
f260: 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f  a WhereClause.*/
f270: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
f280: 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68  reClausePrint(Wh
f290: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
f2a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
f2b0: 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  i=0; i<pWC->nTer
f2c0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65  m; i++){.    whe
f2d0: 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43  reTermPrint(&pWC
f2e0: 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a  ->a[i], i);.  }.
f2f0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
f300: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
f310: 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
f320: 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
f330: 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
f340: 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
f350: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f360: 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
f370: 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
f380: 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
f390: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
f3a0: 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
f3b0: 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
f3c0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
f3d0: 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20  +3)/4;.  struct 
f3e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
f3f0: 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
f400: 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
f410: 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
f420: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
f430: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c  ;.  Bitmask mAll
f440: 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   = (((Bitmask)1)
f450: 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20  <<(nb*4)) - 1;. 
f460: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
f470: 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c  ntf("%c%2d.%0*ll
f480: 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
f490: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
f4a0: 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
f4b0: 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
f4c0: 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20  , nb, p->prereq 
f4d0: 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  & mAll);.  sqlit
f4e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f4f0: 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %12s",.         
f500: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
f510: 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65  m->zAlias ? pIte
f520: 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62  m->zAlias : pTab
f530: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
f540: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
f550: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
f560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
f570: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
f580: 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
f590: 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
f5a0: 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
f5b0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
f5c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
f5d0: 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
f5e0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
f5f0: 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
f600: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
f610: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
f620: 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
f630: 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
f640: 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
f650: 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
f660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f670: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f680: 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
f690: 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
f6a0: 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
f6b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f6c0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
f6d0: 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
f6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
f6f0: 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
f700: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
f710: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
f720: 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
f730: 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
f740: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
f750: 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
f760: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
f770: 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
f780: 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
f790: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
f7a0: 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
f7b0: 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
f7c0: 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
f7d0: 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
f7e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
f7f0: 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
f800: 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
f810: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
f820: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
f830: 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
f840: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
f850: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
f860: 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e  %05x %d-%d", p->
f870: 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
f880: 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20  rm,p->nSkip);.  
f890: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
f8a0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f8b0: 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d  f %05x N %d", p-
f8c0: 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
f8d0: 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  erm);.  }.  sqli
f8e0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f8f0: 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
f900: 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
f910: 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
f920: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d  .  if( p->nLTerm
f930: 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72   && (sqlite3Wher
f940: 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21  eTrace & 0x100)!
f950: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
f960: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f970: 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b  p->nLTerm; i++){
f980: 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d  .      whereTerm
f990: 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b  Print(p->aLTerm[
f9a0: 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  i], i);.    }.  
f9b0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
f9c0: 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
f9d0: 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
f9e0: 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
f9f0: 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
fa00: 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
fa10: 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
fa20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fa30: 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
fa40: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
fa50: 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
fa60: 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
fa70: 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
fa80: 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
fa90: 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
faa0: 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
fab0: 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
fac0: 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
fad0: 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
fae0: 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
faf0: 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
fb00: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fb10: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
fb20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
fb30: 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
fb40: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
fb50: 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
fb60: 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
fb70: 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
fb80: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
fb90: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
fba0: 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
fbb0: 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fbd0: 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
fbe0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
fbf0: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
fc00: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
fc10: 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
fc20: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
fc30: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
fc40: 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
fc50: 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
fc60: 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
fc70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
fc80: 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
fc90: 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
fca0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fcb0: 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74  eeNN(db, p->u.bt
fcc0: 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
fcd0: 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
fce0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
fcf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
fd00: 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
fd10: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
fd20: 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
fd30: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
fd40: 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
fd50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fd60: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
fd70: 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
fd80: 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
fd90: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
fda0: 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
fdb0: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
fdc0: 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
fdd0: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
fde0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
fdf0: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
fe00: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
fe10: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
fe20: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
fe30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
fe40: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
fe50: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
fe60: 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
fe70: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
fe80: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
fe90: 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
fea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
feb0: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
fec0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
fed0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
fee0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
fef0: 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
ff00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ff10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ff20: 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  T;.  memcpy(paNe
ff30: 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
ff40: 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
ff50: 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
ff60: 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
ff70: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
ff80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
ff90: 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
ffa0: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
ffb0: 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
ffc0: 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
ffd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ffe0: 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
fff0: 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
10000 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
10010 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
10020 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
10030 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
10040 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
10050 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
10060 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
10070 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
10080 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
10090 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
100a0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
100b0 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
100c0 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
100d0 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
100e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
100f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10100 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  }.  memcpy(pTo, 
10110 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f  pFrom, WHERE_LOO
10120 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65  P_XFER_SZ);.  me
10130 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
10140 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
10150 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
10160 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
10170 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  0]));.  if( pFro
10180 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
10190 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
101a0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
101b0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
101c0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
101d0 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
101e0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
101f0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72  X)!=0 ){.    pFr
10200 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  om->u.btree.pInd
10210 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ex = 0;.  }.  re
10220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10230 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10240 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
10250 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
10260 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74  d whereLoopDelet
10270 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10280 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
10290 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
102a0 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, p);.  sqlite3
102b0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
102c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
102d0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
102e0 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
102f0 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
10300 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10310 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
10320 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
10330 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
10340 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10350 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
10360 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
10370 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
10380 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
10390 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
103a0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26  Level->pWLoop &&
103b0 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
103c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
103d0 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20  E_IN_ABLE) ){.  
103e0 20 20 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 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
10400 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
10410 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10420 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
10430 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
10440 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
10450 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
10460 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
10470 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
10480 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
10490 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
104a0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
104b0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
104c0 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
104d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
104e0 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e 66  FreeNN(db, pWInf
104f0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
10500 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10510 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
10520 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
10530 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
10540 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
10550 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
10560 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61  **   (2)  X is a
10570 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
10580 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20  f Y.**   (3)  X 
10590 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61  skips at least a
105a0 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61  s many columns a
105b0 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72  s Y.**.** By "pr
105c0 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20  oper subset" we 
105d0 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73  mean that X uses
105e0 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
105f0 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61  use terms.** tha
10600 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
10610 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
10620 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
10630 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62  s also used.** b
10640 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  y Y..**.** If X 
10650 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10660 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
10670 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
10680 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
10690 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
106a0 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
106b0 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
106c0 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
106d0 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
106e0 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
106f0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
10700 73 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64  sted.  The third
10710 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64   rule.** was add
10720 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20  ed because if X 
10730 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c  uses skip-scan l
10740 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74  ess than Y it st
10750 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73  ill might.** des
10760 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  erve a lower cos
10770 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  t even if it is 
10780 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10790 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of Y..*/.static 
107a0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
107b0 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
107c0 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
107d0 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
107e0 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
107f0 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
10800 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
10810 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
10820 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
10830 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
10840 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
10850 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
10860 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70  m-pX->nSkip >= p
10870 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53  Y->nLTerm-pY->nS
10880 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  kip ){.    retur
10890 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
108a0 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
108b0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e  /.  }.  if( pY->
108c0 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69  nSkip > pX->nSki
108d0 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
108e0 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20  if( pX->rRun >= 
108f0 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20  pY->rRun ){.    
10900 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70  if( pX->rRun > p
10910 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e  Y->rRun ) return
10920 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
10930 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
10940 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75  .    if( pX->nOu
10950 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72  t > pY->nOut ) r
10960 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
10970 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10980 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28   Y */.  }.  for(
10990 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  i=pX->nLTerm-1; 
109a0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
109b0 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  if( pX->aLTerm[i
109c0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
109d0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e  .    for(j=pY->n
109e0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
109f0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
10a00 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58  Y->aLTerm[j]==pX
10a10 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72  ->aLTerm[i] ) br
10a20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
10a30 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
10a40 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73  0;  /* X not a s
10a50 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65  ubset of Y since
10a60 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75   term X[i] not u
10a70 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a  sed by Y */.  }.
10a80 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
10a90 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  All conditions m
10aa0 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eet */.}../*.** 
10ab0 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68  Try to adjust th
10ac0 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c  e cost of WhereL
10ad0 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70  oop pTemplate up
10ae0 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72  wards or downwar
10af0 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a  ds so.** that:.*
10b00 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70  *.**   (1) pTemp
10b10 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20  late costs less 
10b20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
10b30 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61  hereLoops that a
10b40 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20  re a proper.**  
10b50 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70       subset of p
10b60 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20  Template.**.**  
10b70 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (2) pTemplate c
10b80 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  osts more than a
10b90 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
10ba0 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54  ops for which pT
10bb0 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20  emplate.**      
10bc0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
10bd0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61  set..**.** To sa
10be0 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69  y "WhereLoop X i
10bf0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10c00 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68  t of Y" means th
10c10 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a  at X uses fewer.
10c20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
10c30 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64  terms than Y and
10c40 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
10c50 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
10c60 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c  ed by X is.** al
10c70 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f  so used by Y..*/
10c80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10c90 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
10ca0 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70  (const WhereLoop
10cb0 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a   *p, WhereLoop *
10cc0 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66  pTemplate){.  if
10cd0 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  ( (pTemplate->ws
10ce0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
10cf0 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75  DEXED)==0 ) retu
10d00 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70  rn;.  for(; p; p
10d10 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  =p->pNextLoop){.
10d20 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
10d30 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
10d40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10d50 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
10d60 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
10d70 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
10d80 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
10d90 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
10da0 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61  ubset(p, pTempla
10db0 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  te) ){.      /* 
10dc0 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
10dd0 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73   cost downward s
10de0 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65  o that it is che
10df0 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20  aper than its . 
10e00 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70       ** subset p
10e10 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
10e20 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
10e30 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
10e40 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
10e50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
10e70 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
10e80 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
10e90 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
10ea0 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  -1));.      pTem
10eb0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
10ec0 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
10ed0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
10ee0 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20  ->nOut - 1;.    
10ef0 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c  }else if( whereL
10f00 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
10f10 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65  Subset(pTemplate
10f20 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  , p) ){.      /*
10f30 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
10f40 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f  e cost upward so
10f50 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74   that it is cost
10f60 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63  lier than p sinc
10f70 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70  e.      ** pTemp
10f80 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72  late is a proper
10f90 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a   subset of p */.
10fa0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
10fb0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
10fc0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
10fd0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
10fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10ff0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11000 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11010 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11020 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b  un, p->nOut+1));
11030 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11040 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
11050 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11060 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
11070 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
11080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
11090 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
110a0 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
110b0 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
110c0 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
110d0 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
110e0 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
110f0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
11100 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
11110 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
11120 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
11130 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
11140 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
11150 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
11160 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
11170 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
11180 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
11190 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
111a0 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
111b0 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
111c0 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
111d0 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
111e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
111f0 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
11200 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
11210 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
11220 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
11230 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
11240 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
11250 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
11260 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
11270 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
11280 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
11290 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
112a0 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
112b0 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
112c0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
112d0 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
112e0 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
112f0 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
11300 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
11310 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
11320 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
11330 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
11340 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
11350 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
11360 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
11370 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
11380 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
11390 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
113a0 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
113b0 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
113c0 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
113d0 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
113e0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
113f0 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
11400 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
11410 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
11420 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
11430 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
11440 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
11450 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
11460 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
11470 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
11480 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
11490 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
114a0 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
114b0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
114c0 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
114d0 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
114e0 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
114f0 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
11500 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
11510 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
11520 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
11530 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11550 70 2d 3e 72 53 65 74 75 70 3d 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 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
11580 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
11590 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
115a0 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
115b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
115c0 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
115d0 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
115e0 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
115f0 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
11600 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
11610 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
11620 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
11630 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
11640 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
11650 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
11660 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c  );..    /* Any l
11670 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70  oop using an app
11680 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  liation-defined 
11690 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52  index (or PRIMAR
116a0 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20  Y KEY or.    ** 
116b0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
116c0 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  t) with one or m
116d0 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ore == constrain
116e0 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  ts is better.   
116f0 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f   ** than an auto
11700 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c  matic index. Unl
11710 65 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70  ess it is a skip
11720 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  -scan. */.    if
11730 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
11740 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
11750 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
11760 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d  emplate->nSkip)=
11770 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
11780 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
11790 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
117a0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
117b0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
117c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
117d0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  )!=0.     && (p-
117e0 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
117f0 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
11800 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a  emplate->prereq.
11810 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
11820 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
11830 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68  * If existing Wh
11840 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
11850 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
11860 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61  te, pTemplate ca
11870 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63  n be.    ** disc
11880 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f  arded.  WhereLoo
11890 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66  p p is better if
118a0 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
118b0 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  p has no more de
118c0 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
118d0 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20  pTemplate, and. 
118e0 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68     **   (2)  p h
118f0 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
11900 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
11910 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a  Template.    */.
11920 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
11930 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
11940 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
11950 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  eq    /* (1)  */
11960 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
11970 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
11980 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20  Setup           
11990 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
119a0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
119b0 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
119c0 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
119d0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
119e0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
119f0 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
11a00 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
11a10 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29           /* (2c)
11a20 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
11a30 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44   return 0;  /* D
11a40 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65  iscard pTemplate
11a50 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
11a60 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69  * If pTemplate i
11a70 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20  s always better 
11a80 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75  than p, then cau
11a90 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
11aa0 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69  ritten.    ** wi
11ab0 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70  th pTemplate.  p
11ac0 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  Template is bett
11ad0 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20  er than p if:.  
11ae0 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d    **   (1)  pTem
11af0 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72  plate has no mor
11b00 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68  e dependences th
11b10 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  an p, and.    **
11b20 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74     (2)  pTemplat
11b30 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  e has an equal o
11b40 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
11b50 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n p..    */.    
11b60 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
11b70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
11b80 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
11b90 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20  prereq   /* (1) 
11ba0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
11bb0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
11bc0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
11bf0 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
11c00 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
11c30 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
11c40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
11c50 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
11c60 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
11c70 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
11c80 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
11c90 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74  ;   /* Cause p t
11ca0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
11cb0 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
11cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11cd0 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f  urn ppPrev;.}../
11ce0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
11cf0 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
11d00 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
11d10 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
11d20 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
11d30 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
11d40 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
11d50 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
11d60 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
11d70 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
11d80 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
11d90 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
11da0 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
11db0 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
11dc0 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
11dd0 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
11de0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
11df0 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
11e00 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
11e10 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
11e20 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
11e30 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
11e40 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
11e50 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
11e60 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
11e70 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
11e80 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
11e90 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75  hen we care abou
11ea0 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
11eb0 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
11ec0 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
11ed0 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
11ee0 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
11ef0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
11f00 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
11f10 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11f20 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
11f30 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
11f40 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
11f50 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
11f60 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
11f70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
11f80 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
11f90 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
11fa0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11fb0 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
11fc0 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
11fd0 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
11fe0 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
11ff0 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
12000 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  ** new template 
12010 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
12020 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
12030 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
12040 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
12050 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
12060 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
12070 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
12080 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
12090 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
120a0 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
120b0 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
120c0 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
120d0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
120e0 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
120f0 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
12100 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
12110 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
12120 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
12130 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
12140 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  op.*/.static int
12150 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
12160 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
12170 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
12180 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
12190 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
121a0 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20  **ppPrev, *p;.  
121b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
121c0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
121d0 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
121e0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
121f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
12200 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  rc;..  /* If pBu
12210 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12220 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
12230 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
12240 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
12250 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
12260 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
12270 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
12280 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74      if( pTemplat
12290 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66  e->nLTerm ){.#if
122a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
122b0 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20  LED.      u16 n 
122c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
122d0 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74  et->n;.      int
122e0 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20   x =.#endif.    
122f0 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
12300 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12310 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  , pTemplate->pre
12320 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  req, pTemplate->
12330 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  rRun,.          
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
12360 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20  ate->nOut);.#if 
12370 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12380 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
12390 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
123a0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
123b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
123c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22  3DebugPrintf(x?"
123d0 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20     or-%d:  ":"  
123e0 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20   or-X:  ", n);. 
123f0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
12400 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
12410 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
12420 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
12430 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
12440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12450 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61  .  /* Look for a
12460 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
12470 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20  Loop to replace 
12480 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20  with pTemplate. 
12490 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41   */.  whereLoopA
124a0 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f  djustCost(pWInfo
124b0 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
124c0 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d  ate);.  ppPrev =
124d0 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
124e0 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c  sser(&pWInfo->pL
124f0 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29  oops, pTemplate)
12500 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d  ;..  if( ppPrev=
12510 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
12520 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  re already exist
12530 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e  s a WhereLoop on
12540 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
12550 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20  s better.    ** 
12560 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
12570 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70  so just ignore p
12580 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20  Template */.#if 
12590 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
125a0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
125b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
125c0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
125d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
125e0 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69  ugPrintf("   ski
125f0 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  p: ");.      whe
12600 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
12610 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
12620 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
12630 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
12640 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65  QLITE_OK;  .  }e
12650 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70  lse{.    p = *pp
12660 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Prev;.  }..  /* 
12670 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
12680 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
12690 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
126a0 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
126b0 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
126c0 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
126d0 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
126e0 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
126f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
12700 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
12710 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
12720 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12730 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12740 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
12750 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
12760 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
12770 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12780 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c  ebugPrintf("repl
12790 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  ace: ");.      w
127a0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
127b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
127c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
127d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
127e0 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20     add: ");.    
127f0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12800 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
12810 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  er->pWC);.  }.#e
12820 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
12830 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ){.    /* Alloca
12840 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  te a new WhereLo
12850 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  op to add to the
12860 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74   end of the list
12870 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20   */.    *ppPrev 
12880 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  = p = sqlite3DbM
12890 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
128a0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
128b0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
128c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
128d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
128e0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
128f0 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f  ;.    p->pNextLo
12900 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  op = 0;.  }else{
12910 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20  .    /* We will 
12920 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57  be overwriting W
12930 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42  hereLoop p[].  B
12940 75 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c  ut before we do,
12950 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f   first.    ** go
12960 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73   through the res
12970 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e  t of the list an
12980 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68  d delete any oth
12990 65 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64  er entries besid
129a0 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68  es.    ** p[] th
129b0 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70  at are also supp
129c0 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  lated by pTempla
129d0 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c  te */.    WhereL
129e0 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26  oop **ppTail = &
129f0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
12a00 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f    WhereLoop *pTo
12a10 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  Del;.    while( 
12a20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20  *ppTail ){.     
12a30 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c   ppTail = whereL
12a40 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70  oopFindLesser(pp
12a50 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29  Tail, pTemplate)
12a60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61  ;.      if( ppTa
12a70 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  il==0 ) break;. 
12a80 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70       pToDel = *p
12a90 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28  pTail;.      if(
12aa0 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65   pToDel==0 ) bre
12ab0 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69  ak;.      *ppTai
12ac0 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78  l = pToDel->pNex
12ad0 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45  tLoop;.#if WHERE
12ae0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12af0 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
12b00 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12b10 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12b20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12b30 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65  gPrintf(" delete
12b40 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68  : ");.        wh
12b50 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f  ereLoopPrint(pTo
12b60 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Del, pBuilder->p
12b70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
12b80 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c  dif.      whereL
12b90 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54  oopDelete(db, pT
12ba0 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oDel);.    }.  }
12bb0 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  .  rc = whereLoo
12bc0 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
12bd0 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28  mplate);.  if( (
12be0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
12bf0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
12c00 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
12c10 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
12c20 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
12c30 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
12c40 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
12c50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
12c60 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
12c70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12c90 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
12ca0 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
12cb0 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
12cc0 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
12cd0 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
12ce0 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
12cf0 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
12d00 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
12d10 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
12d20 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  ex..*.** For eve
12d30 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
12d40 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74  term that is not
12d50 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64   used by the ind
12d60 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20  ex.** and which 
12d70 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62  has a truth prob
12d80 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64  ability assigned
12d90 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   by one of the l
12da0 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20  ikelihood(),.** 
12db0 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c  likely(), or unl
12dc0 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63  ikely() SQL func
12dd0 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68  tions, reduce th
12de0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
12df0 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20  er.** of output 
12e00 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62  rows by the prob
12e10 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65  ability specifie
12e20 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a  d..**.** TUNING:
12e30 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52    For every WHER
12e40 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12e50 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12e60 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12e70 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  nd which does no
12e80 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  t have an assign
12e90 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  ed truth probabi
12ea0 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73  lity, heuristics
12eb0 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65  .** described be
12ec0 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20  low are used to 
12ed0 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
12ee0 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
12ef0 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d  ility..** TODO -
12f00 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20  -> Perhaps this 
12f10 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  is something tha
12f20 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f  t could be impro
12f30 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a  ved by better.**
12f40 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63   table statistic
12f50 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  s..**.** Heurist
12f60 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20  ic 1:  Estimate 
12f70 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
12f80 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e  ility as 93.75%.
12f90 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20    The 93.75%.** 
12fa0 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64  value correspond
12fb0 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73  s to -1 in LogEs
12fc0 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74  t notation, so t
12fd0 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d  his means decrem
12fe0 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65  ent.** the Where
12ff0 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20  Loop.nOut field 
13000 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57  for every such W
13010 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
13020 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
13030 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65  c 2:  If there e
13040 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  xists one or mor
13050 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
13060 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
13070 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e  orm "x==EXPR" an
13080 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20  d EXPR is not a 
13090 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c  constant 0 or 1,
130a0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
130b0 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74  the.** final out
130c0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
130d0 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74   is no greater t
130e0 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74  han 1/4 of the t
130f0 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  otal number.** o
13100 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
13110 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
13120 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61  ords, assume tha
13130 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66  t x==EXPR will f
13140 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20  ilter.** out at 
13150 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34  least 3 out of 4
13160 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20   rows.  If EXPR 
13170 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c  is -1 or 0 or 1,
13180 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a   then maybe the.
13190 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73  ** "x" column is
131a0 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65   boolean or else
131b0 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73   -1 or 0 or 1 is
131c0 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c   a common defaul
131d0 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68  t value.** on th
131e0 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64  e "x" column and
131f0 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
13200 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75   only cap the ou
13210 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
13220 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74  e.** at 1/2 inst
13230 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73  ead of 1/4..*/.s
13240 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
13250 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
13260 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
13270 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68  *pWC,      /* Th
13280 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
13290 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
132a0 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68  Loop,      /* Th
132b0 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74  e loop to adjust
132c0 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c   downward */.  L
132d0 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20  ogEst nRow      
132e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
132f0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65  of rows in the e
13300 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29  ntire table */.)
13310 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
13320 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74  Term, *pX;.  Bit
13330 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20  mask notAllowed 
13340 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  = ~(pLoop->prere
13350 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  q|pLoop->maskSel
13360 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  f);.  int i, j, 
13370 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64  k;.  LogEst iRed
13380 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70  uce = 0;    /* p
13390 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c  Loop->nOut shoul
133a0 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f  d not exceed nRo
133b0 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20  w-iReduce */..  
133c0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
133d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
133e0 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
133f0 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
13400 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
13410 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
13420 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
13430 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
13440 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
13450 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13460 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
13470 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
13480 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
13490 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
134a0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
134b0 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
134c0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
134d0 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
134e0 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
134f0 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
13500 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
13510 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
13520 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
13530 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
13540 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
13550 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
13560 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
13570 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
13580 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
13590 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
135a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
135b0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
135c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
135d0 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  If a truth proba
135e0 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66  bility is specif
135f0 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69  ied using the li
13600 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73  kelihood() hints
13610 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
13620 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62  n use the probab
13630 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62  ility provided b
13640 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
13650 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  n. */.        pL
13660 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  oop->nOut += pTe
13670 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
13680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13690 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62      /* In the ab
136a0 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69  sence of explici
136b0 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  t truth probabil
136c0 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69  ities, use heuri
136d0 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20  stics to.       
136e0 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73   ** guess a reas
136f0 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f  onable truth pro
13700 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20  bability. */.   
13710 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
13720 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
13730 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13740 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29  &(WO_EQ|WO_IS) )
13750 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
13760 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
13770 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
13780 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
13790 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
137a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
137b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
137c0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
137d0 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26  er(pRight, &k) &
137e0 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d  & k>=(-1) && k<=
137f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
13800 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   k = 10;.       
13810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13820 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20        k = 20;.  
13830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13840 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c      if( iReduce<
13850 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b  k ) iReduce = k;
13860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13870 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
13880 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e  f( pLoop->nOut >
13890 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20   nRow-iReduce ) 
138a0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
138b0 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d  Row - iReduce;.}
138c0 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54  ../* .** Term pT
138d0 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20  erm is a vector 
138e0 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e  range comparison
138f0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
13900 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e  first comparison
13910 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f  .** in the vecto
13920 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  r can be optimiz
13930 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  ed using column 
13940 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78  nEq of the index
13950 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
13960 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  on returns the t
13970 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76  otal number of v
13980 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74  ector elements t
13990 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
139a0 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ** as part of th
139b0 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73  e range comparis
139c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  on..**.** For ex
139d0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
139e0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
139f0 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
13a00 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20  (b, c, d) > (?, 
13a10 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20  ?, ?).**.** and 
13a20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a  the index:.**.**
13a30 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
13a40 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c  ... ON (a, b, c,
13a50 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65   d, e).**.** the
13a60 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
13a70 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  would be invoked
13a80 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65   with nEq=1. The
13a90 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
13aa0 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20  in.** this case 
13ab0 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  is 3..*/.static 
13ac0 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56 65  int whereRangeVe
13ad0 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65  ctorLen(.  Parse
13ae0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13af0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13b00 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  xt */.  int iCur
13b10 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13b20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70  Cursor open on p
13b30 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
13b40 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a  pIdx,         /*
13b50 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
13b60 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71   used for a ineq
13b70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
13b80 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20  t */.  int nEq, 
13b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13ba0 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65  umber of prior e
13bb0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
13bc0 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65  nts on same inde
13bd0 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
13be0 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54   *pTerm     /* T
13bf0 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61  he vector inequa
13c00 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
13c10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  */.){.  int nCmp
13c20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
13c30 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e  ctorSize(pTerm->
13c40 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
13c50 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20   int i;..  nCmp 
13c60 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64  = MIN(nCmp, (pId
13c70 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71  x->nColumn - nEq
13c80 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  ));.  for(i=1; i
13c90 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCmp; i++){.   
13ca0 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70   /* Test if comp
13cb0 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72  arison i of pTer
13cc0 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  m is compatible 
13cd0 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e  with column (i+n
13ce0 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  Eq) .    ** of t
13cf0 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74  he index. If not
13d00 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e  , exit the loop.
13d10 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66    */.    char af
13d20 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
13d30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
13d40 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  ison affinity */
13d50 0a 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66  .    char idxaff
13d60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13d70 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f     /* Indexed co
13d80 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a  lumns affinity *
13d90 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
13da0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13db0 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
13dc0 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  n collation sequ
13dd0 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  ence */.    Expr
13de0 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e   *pLhs = pTerm->
13df0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e  pExpr->pLeft->x.
13e00 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
13e10 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68  r;.    Expr *pRh
13e20 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  s = pTerm->pExpr
13e30 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
13e40 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
13e50 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a  EP_xIsSelect ){.
13e60 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68        pRhs = pRh
13e70 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  s->x.pSelect->pE
13e80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13ea0 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e     pRhs = pRhs->
13eb0 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
13ec0 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xpr;.    }..    
13ed0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
13ee0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d  e LHS of the com
13ef0 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c  parison is a col
13f00 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f  umn reference to
13f10 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
13f20 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
13f30 72 69 67 68 74 20 73 6f 75 72 63 65 20 74 61 62  right source tab
13f40 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65  le. And that the
13f50 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64   sort.    ** ord
13f60 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
13f70 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61  column is the sa
13f80 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f  me as the sort o
13f90 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  rder of the.    
13fa0 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65  ** leftmost inde
13fb0 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20  x column.  */.  
13fc0 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d    if( pLhs->op!=
13fd0 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20  TK_COLUMN .     
13fe0 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21  || pLhs->iTable!
13ff0 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70  =iCur .     || p
14000 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49  Lhs->iColumn!=pI
14010 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e  dx->aiColumn[i+n
14020 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64  Eq] .     || pId
14030 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b  x->aSortOrder[i+
14040 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72  nEq]!=pIdx->aSor
14050 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20  tOrder[nEq].    
14060 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
14070 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
14080 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75  ase( pLhs->iColu
14090 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a  mn==XN_ROWID );.
140a0 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
140b0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
140c0 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78  (pRhs, sqlite3Ex
140d0 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29  prAffinity(pLhs)
140e0 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20  );.    idxaff = 
140f0 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
14100 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d  mnAffinity(pIdx-
14110 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69  >pTable, pLhs->i
14120 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28  Column);.    if(
14130 20 61 66 66 21 3d 69 64 78 61 66 66 20 29 20 62   aff!=idxaff ) b
14140 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c  reak;..    pColl
14150 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
14160 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
14170 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68  Parse, pLhs, pRh
14180 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  s);.    if( pCol
14190 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
141a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
141b0 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
141c0 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
141d0 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b  i+nEq]) ) break;
141e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
141f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
14200 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74   the cost C by t
14210 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74  he costMult fact
14220 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79  er T.  This only
14230 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f   occurs if.** co
14240 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
14250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
14260 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53  MULT.*/.#ifdef S
14270 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
14280 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41  TMULT.# define A
14290 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
142a0 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a  er(C,T)  C += T.
142b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
142c0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
142d0 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a  er(C,T).#endif..
142e0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
142f0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
14300 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
14310 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
14320 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  f the .** index 
14330 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d  pIndex. Try to m
14340 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
14350 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
14360 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14370 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  d, pBuilder->pNe
14380 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73  w->nOut contains
14390 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
143a0 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
143b0 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62   to be visited b
143c0 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e  y filtering usin
143d0 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65  g the nEq .** te
143e0 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20  rms only. If it 
143f0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  is modified, thi
14400 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f  s value is resto
14410 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  red before this 
14420 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
14430 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  urns..**.** If p
14440 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
14450 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
14460 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
14470 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
14480 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
14490 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
144a0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
144b0 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
144c0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
144d0 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
144e0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
144f0 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
14500 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14510 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
14520 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
14530 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
14540 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
14550 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
14560 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
14570 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
14580 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
145a0 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
145b0 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
145c0 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
145d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
145e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
145f0 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
14600 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
14610 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
14620 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
14630 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
14640 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14650 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14660 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
14670 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
14680 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
14690 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
146a0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
146b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
146c0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
146d0 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
146e0 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
146f0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
14700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
14710 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
14720 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
14730 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
14760 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
14770 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
14780 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
14790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
147a0 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
147b0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
147c0 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
147d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
147e0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
147f0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
14800 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
14810 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
14820 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
14830 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
14840 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
14850 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
14860 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
14870 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
14880 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
14890 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
148a0 42 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Btm;            
148b0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
148c0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
148d0 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a  u.btree.nBtm */.
148e0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f 70    u16 saved_nTop
148f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14900 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
14910 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
14920 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75  tree.nTop */.  u
14930 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20  16 saved_nSkip; 
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14950 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
14960 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20   of pNew->nSkip 
14970 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
14980 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
14990 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
149a0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
149b0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
149c0 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149e0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
149f0 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
14a00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14a10 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
14a20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14a30 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
14a40 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
14a50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14a60 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
14a70 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
14a80 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
14a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
14aa0 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
14ab0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
14ac0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
14ad0 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
14ae0 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
14af0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
14b00 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
14b10 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
14b20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14b30 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
14b40 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
14b50 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30  WHERETRACE(0x800
14b60 2c 20 28 22 42 45 47 49 4e 20 61 64 64 42 74 72  , ("BEGIN addBtr
14b70 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25  eeIdx(%s), nEq=%
14b80 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
14b90 20 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62             pProb
14ba0 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  e->zName, pNew->
14bb0 75 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a  u.btree.nEq));..
14bc0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
14bd0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14be0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
14bf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
14c00 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
14c10 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
14c20 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
14c30 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
14c40 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
14c50 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
14c60 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
14c70 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
14c80 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
14c90 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61  m==0 );.    opMa
14ca0 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
14cb0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
14cc0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55  LT|WO_LE|WO_ISNU
14cd0 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20  LL|WO_IS;.  }.  
14ce0 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
14cf0 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
14d00 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
14d10 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
14d20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
14d30 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
14d40 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a  be->nColumn );..
14d50 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
14d60 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14d70 0a 20 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20  .  saved_nBtm = 
14d80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
14d90 74 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70  tm;.  saved_nTop
14da0 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
14db0 2e 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e  .nTop;.  saved_n
14dc0 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b  Skip = pNew->nSk
14dd0 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65  ip;.  saved_nLTe
14de0 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  rm = pNew->nLTer
14df0 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61  m;.  saved_wsFla
14e00 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61  gs = pNew->wsFla
14e10 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72  gs;.  saved_prer
14e20 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  eq = pNew->prere
14e30 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20  q;.  saved_nOut 
14e40 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
14e50 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
14e60 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
14e70 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
14e80 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61 76 65 64  ->iCursor, saved
14e90 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20  _nEq,.          
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
14eb0 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
14ec0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
14ed0 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72  0;.  rSize = pPr
14ee0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
14ef0 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  [0];.  rLogSize 
14f00 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
14f10 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
14f20 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21  ITE_OK && pTerm!
14f30 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72  =0; pTerm = wher
14f40 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
14f50 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d  ){.    u16 eOp =
14f60 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14f70 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  r;   /* Shorthan
14f80 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70  d for pTerm->eOp
14f90 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f  erator */.    Lo
14fa0 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20  gEst rCostIdx;. 
14fb0 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e     LogEst nOutUn
14fc0 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20  adjusted;       
14fd0 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20   /* nOut before 
14fe0 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61  IN() and WHERE a
14ff0 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20  djustments */.  
15000 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
15010 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15020 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
15030 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
15040 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
15050 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
15060 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d  if.    if( (eOp=
15070 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70  =WO_ISNULL || (p
15080 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45  Term->wtFlags&TE
15090 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20  RM_VNULL)!=0).  
150a0 20 20 20 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d     && indexColum
150b0 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c  nNotNull(pProbe,
150c0 20 73 61 76 65 64 5f 6e 45 71 29 0a 20 20 20 20   saved_nEq).    
150d0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
150e0 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
150f0 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
15100 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
15110 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
15120 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
15130 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
15140 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
15150 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
15160 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
15170 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
15180 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d   of a LIKE optim
15190 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f  ization range co
151a0 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20  nstraint.    ** 
151b0 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f  to mix with a lo
151c0 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20  wer range bound 
151d0 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20  from some other 
151e0 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66  source */.    if
151f0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
15200 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
15210 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  && pTerm->eOpera
15220 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e  tor==WO_LT ) con
15230 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
15240 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 49 53 20 63  o not allow IS c
15250 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d 20  onstraints from 
15260 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15270 20 74 6f 20 62 65 20 75 73 65 64 20 62 79 20 74   to be used by t
15280 68 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74 20  he.    ** right 
15290 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
152a0 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73  JOIN.  Only cons
152b0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 4f  traints in the O
152c0 4e 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20 20  N clause are.   
152d0 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20   ** allowed */. 
152e0 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67     if( (pSrc->fg
152f0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
15300 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20  EFT)!=0.     && 
15310 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15320 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
15330 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
15340 20 26 26 20 28 65 4f 70 20 26 20 28 57 4f 5f 49   && (eOp & (WO_I
15350 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  S|WO_ISNULL))!=0
15360 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
15370 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
15380 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
15390 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
153a0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
153b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
153c0 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75  .    if( IsUniqu
153d0 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26  eIndex(pProbe) &
153e0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
153f0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29  obe->nKeyCol-1 )
15400 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  {.      pBuilder
15410 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51  ->bldFlags |= SQ
15420 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45  LITE_BLDF_UNIQUE
15430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15440 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64     pBuilder->bld
15450 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
15460 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20  BLDF_INDEXED;.  
15470 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73    }.    pNew->ws
15480 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15490 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
154a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
154b0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
154c0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
154d0 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
154e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
154f0 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54  .nTop = saved_nT
15500 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  op;.    pNew->nL
15510 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
15520 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
15530 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
15540 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
15550 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
15560 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
15570 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
15580 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
15590 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
155a0 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
155b0 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
155c0 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
155d0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
155e0 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
155f0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
15600 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
15610 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
15620 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
15630 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
15640 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
15650 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
15660 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
15670 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
15680 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
15690 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
156a0 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
156b0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
156c0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
156d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
156e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
156f0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
15700 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15710 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15720 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
15730 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
15740 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
15750 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
15760 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
15770 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15780 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
15790 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
157a0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 0a 20  LogEst(25) );.. 
157b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
157c0 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 61 63 74  pression may act
157d0 75 61 6c 6c 79 20 62 65 20 6f 66 20 74 68 65 20  ually be of the 
157e0 66 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e 20 28  form (x, y) IN (
157f0 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20  SELECT...)..    
15800 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
15810 61 73 65 20 74 68 65 72 65 20 69 73 20 61 20 73  ase there is a s
15820 65 70 61 72 61 74 65 20 74 65 72 6d 20 66 6f 72  eparate term for
15830 20 65 61 63 68 20 6f 66 20 28 78 29 20 61 6e 64   each of (x) and
15840 20 28 79 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a   (y)..        **
15850 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 6e 49   However, the nI
15860 6e 20 6d 75 6c 74 69 70 6c 69 65 72 20 73 68 6f  n multiplier sho
15870 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c  uld only be appl
15880 69 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e  ied once, not on
15890 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  ce.        ** fo
158a0 72 20 65 61 63 68 20 73 75 63 68 20 74 65 72 6d  r each such term
158b0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
158c0 6c 6f 6f 70 20 63 68 65 63 6b 73 20 74 68 61 74  loop checks that
158d0 20 70 54 65 72 6d 20 69 73 20 74 68 65 0a 20 20   pTerm is the.  
158e0 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 73        ** first s
158f0 75 63 68 20 74 65 72 6d 20 69 6e 20 75 73 65 2c  uch term in use,
15900 20 61 6e 64 20 73 65 74 73 20 6e 49 6e 20 62 61   and sets nIn ba
15910 63 6b 20 74 6f 20 30 20 69 66 20 69 74 20 69 73  ck to 0 if it is
15920 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
15930 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77   for(i=0; i<pNew
15940 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29  ->nLTerm-1; i++)
15950 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
15960 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
15970 26 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  && pNew->aLTerm[
15980 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78 70 72  i]->pExpr==pExpr
15990 20 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20   ) nIn = 0;.    
159a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
159b0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
159c0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
159d0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
159e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
159f0 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
15a00 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
15a10 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
15a20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
15a30 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
15a40 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  xpr);.        as
15a50 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20  sert( nIn>0 );  
15a60 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61  /* RHS always ha
15a70 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  s 2 or more term
15a80 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72  s...  The parser
15a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15aa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
15ab0 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
15ac0 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
15ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15ae0 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
15af0 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
15b00 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50     int iCol = pP
15b10 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73  robe->aiColumn[s
15b20 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20  aved_nEq];.     
15b30 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
15b40 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
15b50 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  Q;.      assert(
15b60 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77   saved_nEq==pNew
15b70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
15b80 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d  .      if( iCol=
15b90 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20 20  =XN_ROWID .     
15ba0 20 20 7c 7c 20 28 69 43 6f 6c 3e 30 20 26 26 20    || (iCol>0 && 
15bb0 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76  nInMul==0 && sav
15bc0 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ed_nEq==pProbe->
15bd0 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20  nKeyCol-1).     
15be0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15bf0 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62  iCol>=0 && pProb
15c00 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d  e->uniqNotNull==
15c10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
15c20 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15c30 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
15c40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15c50 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
15c60 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
15c70 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
15c80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15c90 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
15ca0 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
15cb0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15cc0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
15cd0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
15ce0 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
15cf0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
15d00 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15d10 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
15d20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
15d30 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
15d40 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15d50 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
15d60 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
15d70 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  MIT;.      pNew-
15d80 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20  >u.btree.nBtm = 
15d90 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72  whereRangeVector
15da0 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  Len(.          p
15db0 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75  Parse, pSrc->iCu
15dc0 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61  rsor, pProbe, sa
15dd0 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20  ved_nEq, pTerm. 
15de0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 42       );.      pB
15df0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
15e00 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
15e10 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
15e20 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
15e30 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
15e40 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
15e50 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
15e60 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
15e70 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
15e80 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
15e90 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
15ea0 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
15eb0 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
15ec0 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
15ed0 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
15ee0 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
15ef0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
15f00 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
15f10 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
15f20 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
15f30 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
15f40 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
15f50 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
15f60 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15f70 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15f80 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
15f90 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
15fa0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
15fb0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
15fc0 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
15fd0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15fe0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
15ff0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
16000 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a  btree.nTop = 1;.
16010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
16020 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
16030 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
16040 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
16050 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
16060 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
16070 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
16080 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
16090 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
160a0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
160b0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
160c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
160d0 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77 68 65 72  tree.nTop = wher
160e0 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
160f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
16100 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
16110 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  , pProbe, saved_
16120 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20  nEq, pTerm.     
16130 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d   );.      pTop =
16140 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
16150 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
16160 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
16170 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
161a0 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
161b0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
161c0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
161d0 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
161e0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
161f0 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
16200 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
16210 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
16220 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
16230 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
16240 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
16250 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
16260 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
16270 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
16280 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
16290 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
162a0 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
162b0 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
162c0 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
162d0 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
162e0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
162f0 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
16300 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
16310 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
16320 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
16330 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
16340 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
16350 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
16360 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
16370 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
16380 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
16390 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
163a0 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
163b0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
163c0 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
163d0 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
163e0 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
163f0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
16400 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
16410 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
16420 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
16430 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16440 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
16450 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
16460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
16470 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
16480 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
16490 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
164a0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
164b0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
164c0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
164d0 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
164e0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
164f0 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29  [saved_nEq]>=0 )
16500 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16510 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
16520 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
16530 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
16540 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
16550 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
16560 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
16570 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
16580 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
16590 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
165a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
165b0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
165c0 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
165d0 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
165e0 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
165f0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
16600 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
16610 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
16620 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
16630 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
16640 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
16650 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
16660 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
16670 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
16680 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
16690 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
166a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
166b0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
166c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
166d0 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
166e0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
166f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16700 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
16710 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
16720 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16730 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
16740 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16750 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
16760 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
16770 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
16780 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
16790 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
167a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
167b0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
167c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
167d0 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
167e0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
167f0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
16800 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
16810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16820 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16830 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
16840 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
16860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
16870 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
16880 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
16890 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
168a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
168b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
168c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
168d0 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
168e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
168f0 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
16900 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
16910 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
16920 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
16930 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
16940 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
16950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16960 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
16970 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
16980 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16990 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
169a0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
169b0 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
169c0 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
169d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
169e0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
169f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
16a00 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
16a10 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
16a20 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
16a30 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
16a40 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
16a50 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
16a60 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
16a70 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
16a80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
16a90 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
16aa0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
16ab0 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
16ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16ae0 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
16af0 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
16b00 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
16b10 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
16b20 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
16b30 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
16b40 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
16b50 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
16b60 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
16b70 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
16b80 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
16b90 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
16ba0 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
16bb0 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
16bc0 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
16bd0 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
16be0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43  able.  */.    rC
16bf0 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  ostIdx = pNew->n
16c00 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  Out + 1 + (15*pP
16c10 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
16c20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61  pSrc->pTab->szTa
16c30 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  bRow;.    pNew->
16c40 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
16c50 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
16c60 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20  , rCostIdx);.   
16c70 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
16c80 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
16c90 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
16ca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  )==0 ){.      pN
16cb0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
16cc0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
16cd0 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
16ce0 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a  ut + 16);.    }.
16cf0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
16d00 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
16d10 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62  un, pProbe->pTab
16d20 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a  le->costMult);..
16d30 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74      nOutUnadjust
16d40 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ed = pNew->nOut;
16d50 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
16d60 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
16d70 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
16d80 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
16d90 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
16da0 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
16db0 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20  der->pWC, pNew, 
16dc0 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  rSize);.    rc =
16dd0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
16de0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
16df0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
16e00 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16e10 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
16e20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
16e30 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
16e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e50 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f   pNew->nOut = nO
16e60 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20  utUnadjusted;.  
16e70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e    }..    if( (pN
16e80 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
16e90 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
16ea0 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
16eb0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
16ec0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
16ed0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
16ee0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
16ef0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
16f00 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
16f10 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
16f20 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
16f30 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
16f40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16f50 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
16f60 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
16f70 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
16f80 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
16f90 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
16fa0 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
16fb0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
16fc0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
16fd0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
16fe0 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
16ff0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17000 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
17010 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20  ;.  pNew->nSkip 
17020 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
17030 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17040 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
17050 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
17060 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
17070 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
17080 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20  d_nLTerm;..  /* 
17090 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
170a0 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
170b0 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
170c0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
170d0 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
170e0 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
170f0 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
17100 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
17110 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
17120 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
17130 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
17140 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
17150 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a  least 18. .  **.
17160 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e    ** The magic n
17170 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65  umber 18 is sele
17180 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69  cted on the basi
17190 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20  s that scanning 
171a0 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20  17 rows.  ** is 
171b0 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75  almost always qu
171c0 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e  icker than an in
171d0 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74  dex seek (even t
171e0 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64  hough if the ind
171f0 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ex.  ** contains
17200 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37   fewer than 2^17
17210 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20   rows we assume 
17220 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68  otherwise in oth
17230 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a  er parts of.  **
17240 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c   the code). And,
17250 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
17260 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  ot, it should no
17270 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c  t be too much sl
17280 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74  ower. .  ** On t
17290 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
172a0 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63  he extra seeks c
172b0 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e  ould end up bein
172c0 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  g significantly.
172d0 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73    ** more expens
172e0 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ive.  */.  asser
172f0 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 42==sqlite3Lo
17300 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66  gEst(18) );.  if
17310 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  ( saved_nEq==sav
17320 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
17330 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
17340 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
17350 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53   pProbe->noSkipS
17360 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72  can==0.   && pPr
17370 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17380 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
17390 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
173a0 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
173b0 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
173c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
173d0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
173e0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
173f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
17400 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
17410 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
17420 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
17430 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  w->nSkip++;.    
17440 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
17450 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
17460 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
17470 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
17480 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
17490 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
174a0 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
174b0 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
174c0 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
174d0 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  q+1];.    pNew->
174e0 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20  nOut -= nIter;. 
174f0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42     /* TUNING:  B
17500 65 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e  ecause uncertain
17510 74 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69  ties in the esti
17520 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73  mates for skip-s
17530 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20  can queries,.   
17540 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20   ** add a 1.375 
17550 66 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20  fudge factor to 
17560 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73  make skip-scan s
17570 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b  lightly less lik
17580 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65  ely. */.    nIte
17590 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72  r += 5;.    wher
175a0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
175b0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
175c0 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72  c, pProbe, nIter
175d0 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   + nInMul);.    
175e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
175f0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  ed_nOut;.    pNe
17600 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
17610 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
17620 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
17630 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70  ved_nSkip;.    p
17640 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
17650 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
17660 7d 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  }..  WHERETRACE(
17670 30 78 38 30 30 2c 20 28 22 45 4e 44 20 61 64 64  0x800, ("END add
17680 42 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45  BtreeIdx(%s), nE
17690 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a  q=%d, rc=%d\n",.
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176b0 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e        pProbe->zN
176c0 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20  ame, saved_nEq, 
176d0 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rc));.  return r
176e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
176f0 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
17700 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
17710 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
17720 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
17730 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
17740 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
17750 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
17760 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
17770 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
17780 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
17790 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
177a0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
177b0 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
177c0 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
177d0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
177e0 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
177f0 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
17800 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
17810 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
17820 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
17830 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
17840 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
17850 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
17860 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
17870 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f  .  ExprList *aCo
17880 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c  lExpr;.  int ii,
17890 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
178a0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
178b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
178c0 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
178d0 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
178e0 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
178f0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
17900 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
17910 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
17920 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
17930 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
17940 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
17950 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
17960 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
17970 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
17980 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
17990 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
179a0 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
179b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  ;.      for(jj=0
179c0 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
179d0 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
179e0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
179f0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
17a00 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20  >aiColumn[jj] ) 
17a10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
17a20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
17a30 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64  (aColExpr = pInd
17a40 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30  ex->aColExpr)!=0
17a50 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
17a60 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
17a70 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
17a80 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
17a90 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21  x->aiColumn[jj]!
17aa0 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69  =XN_EXPR ) conti
17ab0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
17ac0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
17ad0 61 72 65 28 70 45 78 70 72 2c 61 43 6f 6c 45 78  are(pExpr,aColEx
17ae0 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c  pr->a[jj].pExpr,
17af0 69 43 75 72 73 6f 72 29 3d 3d 30 20 29 7b 0a 20  iCursor)==0 ){. 
17b00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17b10 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
17b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17b30 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
17b40 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
17b50 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
17b60 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
17b70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
17b80 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
17b90 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
17ba0 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
17bb0 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
17bc0 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
17bd0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
17be0 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
17bf0 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
17c00 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
17c10 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
17c20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
17c30 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
17c40 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
17c50 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
17c60 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
17c70 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17c80 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
17c90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
17ca0 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
17cb0 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
17cc0 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
17cd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17ce0 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
17cf0 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
17d00 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
17d10 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
17d20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
17d30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
17d40 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
17d50 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
17d60 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
17d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17d80 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
17d90 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
17da0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
17db0 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
17dc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
17dd0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
17de0 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
17df0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
17e00 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61 62    if( !whereUsab
17e10 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
17e20 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e  Tab,pWC,pWhere->
17e30 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
17e40 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  0;.    pWhere = 
17e50 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a  pWhere->pRight;.
17e60 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
17e70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
17e80 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
17e90 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
17ea0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
17eb0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
17ec0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  ( sqlite3ExprImp
17ed0 6c 69 65 73 45 78 70 72 28 70 45 78 70 72 2c 20  liesExpr(pExpr, 
17ee0 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20  pWhere, iTab) . 
17ef0 20 20 20 20 26 26 20 28 21 45 78 70 72 48 61 73      && (!ExprHas
17f00 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17f10 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20  EP_FromJoin) || 
17f20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
17f30 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20  nTable==iTab).  
17f40 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
17f50 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
17f60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
17f70 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
17f80 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
17f90 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
17fa0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
17fb0 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
17fc0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
17fd0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
17fe0 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
17ff0 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
18000 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
18010 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
18020 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
18030 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28  *.** The costs (
18040 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20  WhereLoop.rRun) 
18050 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f  of the b-tree lo
18060 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69  ops added by thi
18070 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  s function.** ar
18080 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  e calculated as 
18090 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46  follows:.**.** F
180a0 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20  or a full scan, 
180b0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62  assuming the tab
180c0 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f  le (or index) co
180d0 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73  ntains nRow rows
180e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
180f0 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20   = nRow * 3.0   
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73   // full-table s
18120 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  can.**     cost 
18130 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20  = nRow * K      
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72  // scan of cover
18160 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18170 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28   cost = nRow * (
18180 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20  K+3.0)          
18190 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
181a0 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
181b0 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  dex.**.** where 
181c0 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74  K is a value bet
181d0 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
181e0 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
181f0 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65  e relative .** e
18200 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65  stimated average
18210 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
18220 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63  ex and table rec
18230 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ords..**.** For 
18240 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77  an index scan, w
18250 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74  here nVisit is t
18260 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  he number of ind
18270 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a  ex rows visited.
18280 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20  ** by the scan, 
18290 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65  and nSeek is the
182a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20   number of seek 
182b0 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69  operations requi
182c0 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69  red on .** the i
182d0 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a  ndex b-tree:.**.
182e0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
182f0 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
18300 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20   + K * nVisit)  
18310 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72          // cover
18320 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18330 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
18340 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b  (log(nRow) + (K+
18350 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20  3.0) * nVisit)  
18360 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e    // non-coverin
18370 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f  g index.**.** No
18380 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73  rmally, nSeek is
18390 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73   1. nSeek values
183a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20   greater than 1 
183b0 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68  come about if th
183c0 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  e .** WHERE clau
183d0 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49  se includes "x I
183e0 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20  N (....)" terms 
183f0 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
18400 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20   "x=?". Or when 
18410 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20  .** implicit "x 
18420 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
18430 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72  M tbl)" terms ar
18440 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70  e added for skip
18450 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  -scans..**.** Th
18460 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75  e estimated valu
18470 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74  es (nRow, nVisit
18480 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63  , nSeek) often c
18490 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61  ontain a large a
184a0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65  mount.** of unce
184b0 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68  rtainty.  For th
184c0 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69  is reason, scori
184d0 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ng is designed t
184e0 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61  o pick plans tha
184f0 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61  t.** "do the lea
18500 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20  st harm" if the 
18510 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e  estimates are in
18520 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65  accurate.  For e
18530 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67  xample, a.** log
18540 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73  (nRow) factor is
18550 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20   omitted from a 
18560 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18570 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72  ex scan in order
18580 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20   to.** bias the 
18590 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72  scoring in favor
185a0 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
185b0 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f  ex, since the wo
185c0 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66  rst-case.** perf
185d0 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67  ormance of using
185e0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72   an index is far
185f0 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
18600 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66   worst-case perf
18610 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20  ormance.** of a 
18620 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e  full table scan.
18630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18640 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
18650 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
18660 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
18670 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18680 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
18690 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
186b0 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
186c0 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
186d0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
186e0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
186f0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
18700 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
18710 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
18720 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
18730 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
18740 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
18750 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
18760 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
18770 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
18780 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
18790 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
187a0 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69  y */.  LogEst ai
187b0 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20  RowEstPk[2];    
187c0 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c     /* The aiRowL
187d0 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  ogEst[] value fo
187e0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
187f0 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d  */.  i16 aiColum
18800 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
18810 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
18820 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
18830 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
18840 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
18850 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
18860 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
18870 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18880 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
18890 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
188a0 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
188b0 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
188c0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
188d0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
188e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
188f0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
18900 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
18910 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18920 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
18930 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
18940 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
18950 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
18980 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45   value */.  LogE
18990 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
189a0 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
189b0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
189c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
189d0 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
189e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
189f0 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62  ithm of the numb
18a00 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
18a10 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
18a20 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
18a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18a40 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61  parsed WHERE cla
18a50 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  use */.  Table *
18a60 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
18a70 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
18a80 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
18a90 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c   .  pNew = pBuil
18aa0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49  der->pNew;.  pWI
18ab0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
18ac0 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69  pWInfo;.  pTabLi
18ad0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
18ae0 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20  bList;.  pSrc = 
18af0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
18b00 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62  ew->iTab;.  pTab
18b10 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
18b20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
18b30 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20  >pWC;.  assert( 
18b40 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
18b50 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
18b60 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
18b70 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
18b80 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
18b90 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
18ba0 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
18bb0 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65  se */.    pProbe
18bc0 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65   = pSrc->pIBInde
18bd0 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  x;.  }else if( !
18be0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
18bf0 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  {.    pProbe = p
18c00 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Tab->pIndex;.  }
18c10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
18c20 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
18c30 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
18c40 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
18c50 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
18c60 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
18c70 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
18c80 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
18c90 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
18ca0 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
18cb0 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
18cc0 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
18cd0 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
18ce0 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
18cf0 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
18d00 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
18d10 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
18d20 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
18d30 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
18d40 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
18d50 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
18d60 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
18d70 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
18d80 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79  ));.    sPk.nKey
18d90 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  Col = 1;.    sPk
18da0 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
18db0 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
18dc0 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
18dd0 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73    sPk.aiRowLogEs
18de0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
18df0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
18e00 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
18e10 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
18e20 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49  Tab;.    sPk.szI
18e30 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a  dxRow = pTab->sz
18e40 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f  TabRow;.    aiRo
18e50 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
18e60 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
18e70 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
18e80 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
18e90 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
18ea0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
18eb0 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
18ec0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
18ed0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
18ee0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
18ef0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
18f00 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
18f10 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
18f20 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
18f30 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
18f40 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
18f50 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
18f60 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
18f70 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
18f80 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
18f90 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
18fa0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
18fb0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
18fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18fd0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
18fe0 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
18ff0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
19000 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
19010 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61  t      /* Not pa
19020 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69  rt of an OR opti
19030 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26  mization */.   &
19040 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
19050 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
19060 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
19070 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
19080 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
19090 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
190a0 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
190b0 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20  c->pIBIndex==0  
190c0 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e      /* Has no IN
190d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
190e0 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
190f0 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20  fg.notIndexed   
19100 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e  /* Has no NOT IN
19110 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a  DEXED clause */.
19120 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
19130 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab)         /* 
19140 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49  Not WITHOUT ROWI
19150 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a  D table. (FIXME:
19160 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20   Why not?) */.  
19170 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
19180 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f  Correlated /* No
19190 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
191a0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26  ubquery */.   &&
191b0 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63   !pSrc->fg.isRec
191c0 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61  ursive  /* Not a
191d0 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f   recursive commo
191e0 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
191f0 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  on. */.  ){.    
19200 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
19210 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
19220 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
19230 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
19240 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
19250 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
19260 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
19270 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
19280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
19290 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
192a0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
192b0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
192c0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
192d0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
192e0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
192f0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
19300 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
19310 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19320 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
19330 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b         pNew->nSk
19340 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
19350 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
19360 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
19370 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
19380 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19390 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
193a0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
193b0 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
193c0 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
193d0 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
193e0 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
193f0 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20     ** estimated 
19400 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e  to be X*N*log2(N
19410 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
19420 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19430 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
19440 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
19450 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20  dexed and where 
19460 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32  X is 7 (LogEst=2
19470 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  8) for normal.  
19480 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
19490 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74  or 1.375 (LogEst
194a0 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e  =4) for views an
194b0 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  d subqueries.  T
194c0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
194d0 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c   ** of X is smal
194e0 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e  ler for views an
194f0 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20  d subqueries so 
19500 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
19510 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a  lanner.        *
19520 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61  * will be more a
19530 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20  ggressive about 
19540 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d  generating autom
19550 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72  atic indexes for
19560 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73  .        ** thos
19570 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65  e objects, since
19580 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70   there is no opp
19590 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20  ortunity to add 
195a0 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a  schema.        *
195b0 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62  * indexes on sub
195c0 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77  queries and view
195d0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
195e0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
195f0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
19600 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  4;.        if( p
19610 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
19620 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
19630 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
19640 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
19650 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
19660 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d  += 24;.        }
19670 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
19680 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19690 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d  w->rSetup, pTab-
196a0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
196b0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53      if( pNew->rS
196c0 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72  etup<0 ) pNew->r
196d0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
196e0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
196f0 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
19700 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
19710 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
19720 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
19730 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
19740 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
19750 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
19760 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
19770 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
19780 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
19790 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
197a0 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
197b0 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
197c0 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
197d0 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
197e0 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
197f0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
19800 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
19810 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
19820 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
19830 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
19840 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
19850 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
19860 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
19870 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
19880 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
19890 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
198a0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
198b0 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72  = mPrereq | pTer
198c0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
198d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
198e0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
198f0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
19900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19910 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19920 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
19930 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
19940 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
19950 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
19960 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
19970 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
19980 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
19990 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
199a0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
199b0 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
199c0 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
199d0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
199e0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
199f0 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  WC, pProbe->pPar
19a00 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20  tIdxWhere) ){.  
19a10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
19a20 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e  ew->iTab!=pSrc->
19a30 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53  iCursor );  /* S
19a40 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37  ee ticket [98d97
19a50 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20  3b8f5] */.      
19a60 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
19a70 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
19a80 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
19a90 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
19aa0 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50  }.    rSize = pP
19ab0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
19ac0 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  t[0];.    pNew->
19ad0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
19ae0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
19af0 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20  ee.nBtm = 0;.   
19b00 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
19b10 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Top = 0;.    pNe
19b20 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
19b30 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
19b40 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
19b50 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
19b60 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
19b70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
19b80 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20  eq = mPrereq;.  
19b90 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
19ba0 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
19bb0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
19bc0 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
19bd0 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
19be0 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
19bf0 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
19c00 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
19c10 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
19c20 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
19c30 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
19c40 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
19c50 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
19c60 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
19c70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
19c80 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
19c90 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
19ca0 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
19cb0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
19cc0 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
19cd0 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
19ce0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
19cf0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
19d00 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
19d10 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
19d20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
19d30 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
19d40 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
19d50 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
19d60 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
19d70 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20  (N*3.0). */.    
19d80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
19d90 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20  Size + 16;.     
19da0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
19db0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
19dc0 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
19dd0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
19de0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
19df0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
19e00 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
19e10 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
19e20 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
19e30 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
19e40 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
19e50 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
19e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
19e70 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
19e80 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
19e90 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
19ea0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
19eb0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
19ec0 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
19ed0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
19ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19ef0 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
19f00 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
19f10 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
19f20 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19f30 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
19f40 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
19f50 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
19f60 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
19f70 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  D;.      }..    
19f80 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
19f90 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
19fa0 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
19fb0 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  | !HasRowid(pTab
19fc0 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 72 6f  ).       || pPro
19fd0 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
19fe0 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  e!=0.       || (
19ff0 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26   m==0.         &
1a000 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  & pProbe->bUnord
1a010 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
1a020 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49   && (pProbe->szI
1a030 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
1a040 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26  bRow).         &
1a050 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
1a060 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1a070 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
1a080 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
1a090 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a0a0 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
1a0b0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
1a0c0 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
1a0d0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
1a0e0 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
1a0f0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
1a100 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1a110 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1a120 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
1a130 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
1a140 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
1a150 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ing the index ro
1a160 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65  ws is N*K, where
1a170 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   K is.        **
1a180 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
1a190 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20   3.0, depending 
1a1a0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
1a1b0 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20  sizes of the.   
1a1c0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e       ** index an
1a1d0 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 2a 2f  d table rows. */
1a1e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1a1f0 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20  Run = rSize + 1 
1a200 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
1a210 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
1a220 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
1a230 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
1a240 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1a250 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
1a260 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 61  ng index scan, a
1a270 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74 20 6f  dd in the cost o
1a280 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  f.          ** d
1a290 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  oing table looku
1a2a0 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20 77 69  ps.  The cost wi
1a2b0 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e 75 6d  ll be 3x the num
1a2c0 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
1a2d0 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 61   ** lookups.  Ta
1a2e0 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20  ke into account 
1a2f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1a300 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 0a 20  ms that can be. 
1a310 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 74 69           ** sati
1a320 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75 73 74  sfied using just
1a330 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
1a340 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1a350 69 72 65 20 61 0a 20 20 20 20 20 20 20 20 20 20  ire a.          
1a360 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e  ** table lookup.
1a370 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c 6f   */.          Lo
1a380 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72  gEst nLookup = r
1a390 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a 20 42  Size + 16;  /* B
1a3a0 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33 20 2a  ase cost:  N*3 *
1a3b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
1a3c0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ii;.          in
1a3d0 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
1a3e0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
1a3f0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1a400 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  WC2 = &pWInfo->s
1a410 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  WC;.          fo
1a420 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 32 2d  r(ii=0; ii<pWC2-
1a430 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
1a440 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
1a450 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
1a460 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  WC2->a[ii];.    
1a470 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
1a480 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
1a490 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 45  yIndex(pTerm->pE
1a4a0 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72 6f 62  xpr, iCur, pProb
1a4b0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
1a4c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a4d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a4e0 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20 63 61       /* pTerm ca
1a4f0 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 75  n be evaluated u
1a500 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
1a510 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63 65 0a  dex.  So reduce.
1a520 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1a530 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
1a540 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f 6f 6b  er of table look
1a550 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  ups accordingly 
1a560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1a570 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
1a580 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
1a590 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 20          nLookup 
1a5a0 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
1a5b0 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rob;.           
1a5c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a5d0 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b        nLookup--;
1a5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1a5f0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1a600 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1a610 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d  IS) ) nLookup -=
1a620 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20 20 20   19;.           
1a630 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1a640 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1a650 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1a660 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1a670 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c  d(pNew->rRun, nL
1a680 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  ookup);.        
1a690 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
1a6a0 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
1a6b0 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
1a6c0 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
1a6d0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
1a6e0 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
1a6f0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
1a700 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1a710 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a720 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a730 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
1a740 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1a750 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
1a760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a770 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
1a780 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ags = 0;.    rc 
1a790 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1a7a0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
1a7b0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
1a7c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 42 75   0);.    if( pBu
1a7d0 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 3d  ilder->bldFlags=
1a7e0 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44  =SQLITE_BLDF_IND
1a7f0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EXED ){.      /*
1a800 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71 75 65   If a non-unique
1a810 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 2c 20   index is used, 
1a820 6f 72 20 69 66 20 61 20 70 72 65 66 69 78 20 6f  or if a prefix o
1a830 66 20 74 68 65 20 6b 65 79 20 66 6f 72 0a 20 20  f the key for.  
1a840 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 20 69 6e      ** unique in
1a850 64 65 78 20 69 73 20 75 73 65 64 20 28 6d 61 6b  dex is used (mak
1a860 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66 75  ing the index fu
1a870 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d 75  nctionally non-u
1a880 6e 69 71 75 65 29 0a 20 20 20 20 20 20 2a 2a 20  nique).      ** 
1a890 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  then the sqlite_
1a8a0 73 74 61 74 31 20 64 61 74 61 20 62 65 63 6f 6d  stat1 data becom
1a8b0 65 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72  es important for
1a8c0 20 73 63 6f 72 69 6e 67 20 74 68 65 0a 20 20 20   scoring the.   
1a8d0 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a 20 20     ** plan */.  
1a8e0 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
1a8f0 67 73 20 7c 3d 20 54 46 5f 53 74 61 74 73 55 73  gs |= TF_StatsUs
1a900 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ed;.    }.#ifdef
1a910 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1a920 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
1a930 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
1a940 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
1a950 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
1a960 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
1a970 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
1a980 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
1a990 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
1a9a0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
1a9b0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1a9c0 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
1a9d0 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
1a9e0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
1a9f0 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1aa00 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b  pIBIndex ) break
1aa10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1aa20 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1aa30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1aa40 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72  LTABLE../*.** Ar
1aa50 67 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20  gument pIdxInfo 
1aa60 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
1aa70 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f  ated with all co
1aa80 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d  nstraints that m
1aa90 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79  ay.** be used by
1aaa0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1aab0 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
1aac0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
1aad0 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66  >iTab. This.** f
1aae0 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20  unction marks a 
1aaf0 73 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20  subset of those 
1ab00 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62  constraints usab
1ab10 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  le, invokes the.
1ab20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  ** xBestIndex me
1ab30 74 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68  thod and adds th
1ab40 65 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20  e returned plan 
1ab50 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
1ab60 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20  ** A constraint 
1ab70 69 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65  is marked usable
1ab80 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41   if:.**.**   * A
1ab90 72 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20  rgument mUsable 
1aba0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69  indicates that i
1abb0 74 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ts prerequisites
1abc0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
1abd0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74  and.**.**   * It
1abe0 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74   is not one of t
1abf0 68 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65  he operators spe
1ac00 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45  cified in the mE
1ac10 78 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73  xclude mask pass
1ac20 65 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65  ed.**     as the
1ac30 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
1ac40 20 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74   (which in pract
1ac50 69 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f  ice is either WO
1ac60 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a  _IN or 0)..**.**
1ac70 20 41 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65   Argument mPrere
1ac80 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74  q is a mask of t
1ac90 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1aca0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1acb0 65 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  e the.** virtual
1acc0 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
1acd0 6f 6e 2e 20 54 68 65 73 65 20 61 72 65 20 61 64  on. These are ad
1ace0 64 65 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73  ded to the plans
1acf0 20 70 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a   prerequisites.*
1ad00 2a 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 61  * before it is a
1ad10 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1ad20 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70  ..**.** Output p
1ad30 61 72 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69  arameter *pbIn i
1ad40 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
1ad50 20 74 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20   the plan added 
1ad60 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75  to pBuilder.** u
1ad70 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1ad80 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20  WO_IN terms, or 
1ad90 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
1ada0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1adb0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1adc0 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f  alOne(.  WhereLo
1add0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1ade0 64 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d  der,.  Bitmask m
1adf0 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20  Prereq,         
1ae00 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1ae10 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75  f tables that mu
1ae20 73 74 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20  st be used. */. 
1ae30 20 42 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65   Bitmask mUsable
1ae40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ae50 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62   /* Mask of usab
1ae60 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75  le tables */.  u
1ae70 31 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20  16 mExclude,    
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae90 2a 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20  * Exclude terms 
1aea0 75 73 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72  using these oper
1aeb0 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ators */.  sqlit
1aec0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1aed0 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f  IdxInfo,   /* Po
1aee0 70 75 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66  pulated object f
1aef0 6f 72 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  or xBestIndex */
1af00 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20  .  u16 mNoOmit, 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69     /* Do not omi
1af30 74 20 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69  t these constrai
1af40 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
1af50 49 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  In              
1af60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1af70 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1af80 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70  es an IN(...) op
1af90 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c   */.){.  WhereCl
1afa0 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69  ause *pWC = pBui
1afb0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72  lder->pWC;.  str
1afc0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
1afd0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
1afe0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
1aff0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1b000 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
1b010 2a 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e  *pUsage = pIdxIn
1b020 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
1b030 73 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sage;.  int i;. 
1b040 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69   int mxTerm;.  i
1b050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b060 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1b070 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1b080 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a  >pNew;.  Parse *
1b090 70 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65  pParse = pBuilde
1b0a0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  r->pWInfo->pPars
1b0b0 65 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  e;.  struct SrcL
1b0c0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d  ist_item *pSrc =
1b0d0 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e   &pBuilder->pWIn
1b0e0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1b0f0 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69  pNew->iTab];.  i
1b100 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
1b110 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
1b120 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72  traint;..  asser
1b130 74 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50  t( (mUsable & mP
1b140 72 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20  rereq)==mPrereq 
1b150 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a  );.  *pbIn = 0;.
1b160 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
1b170 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20   mPrereq;..  /* 
1b180 53 65 74 20 74 68 65 20 75 73 61 62 6c 65 20 66  Set the usable f
1b190 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65  lag on the subse
1b1a0 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  t of constraints
1b1b0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
1b1c0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d    ** arguments m
1b1d0 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c  Usable and mExcl
1b1e0 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f  ude. */.  pIdxCo
1b1f0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
1b200 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1b210 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
1b220 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
1b230 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1b240 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
1b250 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
1b260 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1b270 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78  m = &pWC->a[pIdx
1b280 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
1b290 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  t];.    pIdxCons
1b2a0 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
1b2b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1b2c0 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 73 61  ereqRight & mUsa
1b2d0 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65  ble)==pTerm->pre
1b2e0 72 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 26  reqRight .     &
1b2f0 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
1b300 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d  tor & mExclude)=
1b310 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1b320 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
1b330 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1b340 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1b350 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c   the output fiel
1b360 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ds of the sqlite
1b370 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
1b380 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73  ucture */.  mems
1b390 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
1b3a0 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
1b3b0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1b3c0 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f  assert( pIdxInfo
1b3d0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1b3e0 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49  tr==0 );.  pIdxI
1b3f0 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
1b400 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
1b410 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Num = 0;.  pIdxI
1b420 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1b430 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78  umed = 0;.  pIdx
1b440 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1b450 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
1b460 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
1b470 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
1b480 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35  timatedRows = 25
1b490 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
1b4a0 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49  xFlags = 0;.  pI
1b4b0 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20  dxInfo->colUsed 
1b4c0 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
1b4d0 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a  )pSrc->colUsed;.
1b4e0 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
1b4f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
1b500 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68  BestIndex() meth
1b510 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61  od */.  rc = vta
1b520 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
1b530 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70  e, pSrc->pTab, p
1b540 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  IdxInfo);.  if( 
1b550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1b560 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a  .  mxTerm = -1;.
1b570 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1b580 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61  nLSlot>=nConstra
1b590 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  int );.  for(i=0
1b5a0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
1b5b0 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
1b5c0 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65  rm[i] = 0;.  pNe
1b5d0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1b5e0 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f  sk = 0;.  pIdxCo
1b5f0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
1b600 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1b610 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
1b620 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
1b630 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1b640 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
1b650 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
1b660 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
1b670 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73  if( (iTerm = pUs
1b680 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
1b690 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20   - 1)>=0 ){.    
1b6a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1b6b0 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  rm;.      int j 
1b6c0 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
1b6d0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  mOffset;.      i
1b6e0 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
1b6f0 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20  raint.       || 
1b700 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e  j<0.       || j>
1b710 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
1b720 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
1b730 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
1b740 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d      || pIdxCons-
1b750 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20  >usable==0.     
1b760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b770 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1b790 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
1b7a0 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c  s.xBestIndex mal
1b7b0 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
1b7c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1b7d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1b7f0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1b800 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
1b810 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b820 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
1b830 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
1b840 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
1b850 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
1b860 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
1b870 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
1b880 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1b890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
1b8a0 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
1b8b0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
1b8c0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1b8d0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
1b8e0 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
1b8f0 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
1b900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b910 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
1b920 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1b930 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
1b940 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
1b950 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
1b960 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1b970 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
1b980 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
1b990 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1b9a0 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
1b9b0 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1b9c0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1b9d0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1b9e0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1b9f0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
1ba00 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
1ba10 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
1ba20 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
1ba30 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
1ba40 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
1ba50 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
1ba60 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
1ba70 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
1ba80 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
1ba90 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
1baa0 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
1bab0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
1bac0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
1bad0 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
1bae0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
1baf0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1bb00 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
1bb10 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
1bb20 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
1bb30 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
1bb40 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
1bb50 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20  In = 1; assert( 
1bb60 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49  (mExclude & WO_I
1bb70 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  N)==0 );.      }
1bb80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
1bb90 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1bba0 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a  sk &= ~mNoOmit;.
1bbb0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1bbc0 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 61 73  = mxTerm+1;.  as
1bbd0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
1bbe0 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
1bbf0 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   );.  pNew->u.vt
1bc00 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
1bc10 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
1bc20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1bc30 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
1bc40 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1bc50 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  tr;.  pIdxInfo->
1bc60 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1bc70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
1bc80 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
1bc90 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
1bca0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1bcb0 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
1bcc0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1bcd0 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
1bce0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
1bcf0 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65  erBy : 0);.  pNe
1bd00 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1bd10 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
1bd20 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
1bd30 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
1bd40 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
1bd50 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
1bd60 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
1bd70 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1bd80 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Rows);..  /* Set
1bd90 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1bda0 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42  W flag if the xB
1bdb0 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1bdc0 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a  d indicated.  **
1bdd0 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
1bde0 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73  ill visit at mos
1bdf0 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72  t one row. Clear
1be00 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a   it otherwise. *
1be10 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  /.  if( pIdxInfo
1be20 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c  ->idxFlags & SQL
1be30 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1be40 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65  NIQUE ){.    pNe
1be50 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
1be60 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65  ERE_ONEROW;.  }e
1be70 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  lse{.    pNew->w
1be80 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1be90 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  _ONEROW;.  }.  r
1bea0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1beb0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1bec0 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ew);.  if( pNew-
1bed0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1bee0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1bef0 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1bf00 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  b.idxStr);.    p
1bf10 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1bf20 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
1bf30 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
1bf40 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72  f, ("  bIn=%d pr
1bf50 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72  ereqIn=%04llx pr
1bf60 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e  ereqOut=%04llx\n
1bf70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1bf80 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20           *pbIn, 
1bf90 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1bfa0 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  mPrereq,.       
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bfc0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28  sqlite3_uint64)(
1bfd0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1bfe0 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72  mPrereq)));..  r
1bff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1c000 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
1c010 63 74 20 75 73 65 64 20 74 6f 20 70 61 73 73 20  ct used to pass 
1c020 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1c030 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1c040 74 75 61 6c 28 29 0a 2a 2a 20 74 6f 20 73 71 6c  tual().** to sql
1c050 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74  ite3_vtab_collat
1c060 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74  ion()..*/.struct
1c070 20 42 65 73 74 49 6e 64 65 78 43 74 78 20 7b 0a   BestIndexCtx {.
1c080 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1c090 57 43 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  WC;.  sqlite3_in
1c0a0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
1c0b0 66 6f 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo;.  Parse *pPa
1c0c0 72 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  rse;.};../*.** I
1c0d0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
1c0e0 69 73 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20  is invoked from 
1c0f0 77 69 74 68 69 6e 20 61 6e 20 78 42 65 73 74 49  within an xBestI
1c100 6e 64 65 78 28 29 20 63 61 6c 6c 62 61 63 6b 2c  ndex() callback,
1c110 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61   it.** returns a
1c120 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
1c130 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1c140 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1c150 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71  collation.** seq
1c160 75 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64  uence associated
1c170 20 77 69 74 68 20 65 6c 65 6d 65 6e 74 20 69 43   with element iC
1c180 6f 6e 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ons of the sqlit
1c190 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43  e3_index_info.aC
1c1a0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 61 72 72  onstraint.** arr
1c1b0 61 79 2e 20 4f 72 2c 20 69 66 20 69 43 6f 6e 73  ay. Or, if iCons
1c1c0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1c1d0 20 6f 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20   or there is no 
1c1e0 61 63 74 69 76 65 20 78 42 65 73 74 49 6e 64 65  active xBestInde
1c1f0 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65 74 75 72  x.** call, retur
1c200 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74  n NULL..*/.const
1c210 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76   char *sqlite3_v
1c220 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 73 71  tab_collation(sq
1c230 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
1c240 43 6f 6e 73 29 7b 0a 20 20 73 74 72 75 63 74 20  Cons){.  struct 
1c250 42 65 73 74 49 6e 64 65 78 43 74 78 20 2a 70 20  BestIndexCtx *p 
1c260 3d 20 28 73 74 72 75 63 74 20 42 65 73 74 49 6e  = (struct BestIn
1c270 64 65 78 43 74 78 2a 29 64 62 2d 3e 70 42 65 73  dexCtx*)db->pBes
1c280 74 49 6e 64 65 78 43 74 78 3b 0a 20 20 63 6f 6e  tIndexCtx;.  con
1c290 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
1c2a0 30 3b 0a 20 20 69 66 28 20 70 20 26 26 20 69 43  0;.  if( p && iC
1c2b0 6f 6e 73 3e 3d 30 20 26 26 20 69 43 6f 6e 73 3c  ons>=0 && iCons<
1c2c0 70 2d 3e 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  p->pIdxInfo->nCo
1c2d0 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1c2e0 69 6e 74 20 69 54 65 72 6d 20 3d 20 70 2d 3e 70  int iTerm = p->p
1c2f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1c300 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69 54 65 72  aint[iCons].iTer
1c310 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 45 78 70  mOffset;.    Exp
1c320 72 20 2a 70 58 20 3d 20 70 2d 3e 70 57 43 2d 3e  r *pX = p->pWC->
1c330 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a  a[iTerm].pExpr;.
1c340 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 20      CollSeq *pC 
1c350 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
1c360 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 2d  ompareCollSeq(p-
1c370 3e 70 50 61 72 73 65 2c 70 58 2d 3e 70 4c 65 66  >pParse,pX->pLef
1c380 74 2c 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  t,pX->pRight);. 
1c390 20 20 20 7a 52 65 74 20 3d 20 28 70 43 20 3f 20     zRet = (pC ? 
1c3a0 70 43 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  pC->zName : "BIN
1c3b0 41 52 59 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ARY");.  }.  ret
1c3c0 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
1c3d0 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
1c3e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
1c3f0 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
1c400 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20  join identified 
1c410 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e  by.** pBuilder->
1c420 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
1c430 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
1c440 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69  nteed to be a vi
1c450 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
1c460 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1c470 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53  no LEFT or CROSS
1c480 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74   JOIN joins in t
1c490 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d  he query, both m
1c4a0 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55  Prereq and.** mU
1c4b0 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74 20  nusable are set 
1c4c0 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c  to 0. Otherwise,
1c4d0 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61   mPrereq is a ma
1c4e0 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63  sk of all FROM c
1c4f0 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  lause.** entries
1c500 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
1c510 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  re the virtual t
1c520 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
1c530 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a   clause and are.
1c540 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  ** separated fro
1c550 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
1c560 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f   one LEFT or CRO
1c570 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72  SS JOIN. Similar
1c580 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73  ly, the.** mUnus
1c590 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  able mask contai
1c5a0 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  ns all FROM clau
1c5b0 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  se entries that 
1c5c0 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a  occur after the.
1c5d0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1c5e0 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74   and are separat
1c5f0 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1c600 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1c610 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49  or .** CROSS JOI
1c620 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  N. .**.** For ex
1c630 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
1c640 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  ery were:.**.** 
1c650 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74    ... FROM t1, t
1c660 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20  2 LEFT JOIN t3, 
1c670 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49  t4, vt CROSS JOI
1c680 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20  N t5, t6;.**.** 
1c690 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f 72  then mPrereq cor
1c6a0 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c  responds to (t1,
1c6b0 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62   t2) and mUnusab
1c6c0 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a  le to (t5, t6)..
1c6d0 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61  **.** All the ta
1c6e0 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71 20  bles in mPrereq 
1c6f0 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1c700 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
1c710 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74  nt virtual .** t
1c720 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72  able. So any ter
1c730 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c  ms for which all
1c740 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
1c750 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
1c760 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79 20  .** mPrereq may 
1c770 62 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  be specified as 
1c780 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20  "usable" in all 
1c790 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e  calls to xBestIn
1c7a0 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73  dex. .** Convers
1c7b0 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ely, all tables 
1c7c0 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73  in mUnusable mus
1c7d0 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1c7e0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  er the current.*
1c7f0 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  * virtual table,
1c800 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   so any terms fo
1c810 72 20 77 68 69 63 68 20 74 68 65 20 70 72 65 72  r which the prer
1c820 65 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c 61  equisites overla
1c830 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61  p with.** mUnusa
1c840 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ble should alway
1c850 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20  s be configured 
1c860 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20  as "not-usable" 
1c870 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e 0a  for xBestIndex..
1c880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1c890 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1c8a0 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
1c8b0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
1c8c0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
1c8d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
1c8e0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
1c8f0 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eq,             
1c900 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
1c910 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1c920 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 2a  efore this one *
1c930 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75  /.  Bitmask mUnu
1c940 73 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20  sable           
1c950 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
1c960 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1c970 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20 2a  after this one *
1c980 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1c990 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1c9a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1c9b0 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  de */.  WhereInf
1c9c0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
1c9d0 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
1c9e0 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
1c9f0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1ca00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ca10 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1ca20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1ca30 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
1ca40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ca50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1ca60 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1ca70 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
1ca80 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1ca90 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
1caa0 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  h */.  sqlite3_i
1cab0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20  ndex_info *p;   
1cac0 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
1cad0 20 70 61 73 73 20 74 6f 20 78 42 65 73 74 49 6e   pass to xBestIn
1cae0 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  dex() */.  int n
1caf0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
1cb00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cb10 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
1cb20 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62   in p */.  int b
1cb30 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
1cb40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1cb50 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e 28  if plan uses IN(
1cb60 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ...) operator */
1cb70 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1cb80 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42  ew;.  Bitmask mB
1cb90 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
1cba0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73 65     /* Tables use
1cbb0 64 20 62 79 20 62 65 73 74 20 70 6f 73 73 69 62  d by best possib
1cbc0 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36  le plan */.  u16
1cbd0 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 73 74 72 75   mNoOmit;.  stru
1cbe0 63 74 20 42 65 73 74 49 6e 64 65 78 43 74 78 20  ct BestIndexCtx 
1cbf0 62 69 63 3b 0a 20 20 76 6f 69 64 20 2a 70 53 61  bic;.  void *pSa
1cc00 76 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ved;..  assert( 
1cc10 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73  (mPrereq & mUnus
1cc20 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57  able)==0 );.  pW
1cc30 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1cc40 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
1cc50 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1cc60 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  se;.  pWC = pBui
1cc70 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
1cc80 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1cc90 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
1cca0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1ccb0 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
1ccc0 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
1ccd0 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
1cce0 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65  ;.  p = allocate
1ccf0 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
1cd00 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65  , pWC, mUnusable
1cd10 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72  , pSrc, pBuilder
1cd20 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
1cd30 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20     &mNoOmit);.  
1cd40 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1cd50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1cd60 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  KPT;.  pNew->rSe
1cd70 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
1cd80 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1cd90 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
1cda0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1cdb0 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
1cdc0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1cdd0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1cde0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  p->nConstraint;.
1cdf0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
1ce00 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
1ce10 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
1ce20 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
1ce30 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1ce40 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65  ->db, p);.    re
1ce50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1ce60 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 62  M_BKPT;.  }..  b
1ce70 69 63 2e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  ic.pWC = pWC;.  
1ce80 62 69 63 2e 70 49 64 78 49 6e 66 6f 20 3d 20 70  bic.pIdxInfo = p
1ce90 3b 0a 20 20 62 69 63 2e 70 50 61 72 73 65 20 3d  ;.  bic.pParse =
1cea0 20 70 50 61 72 73 65 3b 0a 20 20 70 53 61 76 65   pParse;.  pSave
1ceb0 64 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  d = pParse->db->
1cec0 70 42 65 73 74 49 6e 64 65 78 43 74 78 3b 0a 20  pBestIndexCtx;. 
1ced0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65   pParse->db->pBe
1cee0 73 74 49 6e 64 65 78 43 74 78 20 3d 20 28 76 6f  stIndexCtx = (vo
1cef0 69 64 2a 29 26 62 69 63 3b 0a 0a 20 20 2f 2a 20  id*)&bic;..  /* 
1cf00 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73 74  First call xBest
1cf10 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c  Index() with all
1cf20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61   constraints usa
1cf30 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54  ble. */.  WHERET
1cf40 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1cf50 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75  irtualOne: all u
1cf60 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63  sable\n"));.  rc
1cf70 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1cf80 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64  irtualOne(pBuild
1cf90 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c  er, mPrereq, ALL
1cfa0 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  BITS, 0, p, mNoO
1cfb0 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f  mit, &bIn);..  /
1cfc0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
1cfd0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69   xBestIndex() wi
1cfe0 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61  th all terms ena
1cff0 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61 20  bled produced a 
1d000 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64  plan.  ** that d
1d010 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
1d020 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c 65  any source table
1d030 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77  s (IOW: a plan w
1d040 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20  ith mBest==0),. 
1d050 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
1d060 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61  s no point in ma
1d070 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65 72  king any further
1d080 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1d090 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e  ndex() .  ** sin
1d0a0 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  ce they will all
1d0b0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
1d0c0 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65 20   result (if the 
1d0d0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20 2a  xBestIndex().  *
1d0e0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1d0f0 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20   is sane). */.  
1d100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d110 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28 70  K && (mBest = (p
1d120 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1d130 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a 20  Prereq))!=0 ){. 
1d140 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20     int seenZero 
1d150 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d160 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 6c   /* True if a pl
1d170 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65  an with no prere
1d180 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  qs seen */.    i
1d190 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20  nt seenZeroNoIN 
1d1a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1d1b0 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65  Plan with no pre
1d1c0 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e  reqs and no IN(.
1d1d0 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  ..) seen */.    
1d1e0 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20  Bitmask mPrev = 
1d1f0 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  0;.    Bitmask m
1d200 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20  BestNoIn = 0;.. 
1d210 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c 61     /* If the pla
1d220 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68  n produced by th
1d230 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 75  e earlier call u
1d240 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74  ses an IN(...) t
1d250 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  erm, call.    **
1d260 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61 69   xBestIndex agai
1d270 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74  n, this time wit
1d280 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20  h IN(...) terms 
1d290 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
1d2a0 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20 20   if( bIn ){.    
1d2b0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1d2c0 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1d2d0 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f  e: all usable w/
1d2e0 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1d2f0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1d300 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1d310 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1d320 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49  , mPrereq, ALLBI
1d330 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  TS, WO_IN, p, mN
1d340 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1d350 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d      assert( bIn=
1d360 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73  =0 );.      mBes
1d370 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72  tNoIn = pNew->pr
1d380 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b  ereq & ~mPrereq;
1d390 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74  .      if( mBest
1d3a0 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIn==0 ){.     
1d3b0 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1d3c0 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1d3d0 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  oNoIN = 1;.     
1d3e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d3f0 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   Call xBestIndex
1d400 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64   once for each d
1d410 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66  istinct value of
1d420 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26 20   (prereqRight & 
1d430 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a  ~mPrereq) .    *
1d440 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  * in the set of 
1d450 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79  terms that apply
1d460 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1d470 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
1d480 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  */.    while( rc
1d490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d4a0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1d4b0 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20    Bitmask mNext 
1d4c0 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20  = ALLBITS;.     
1d4d0 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30   assert( mNext>0
1d4e0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1d4f0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1d500 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1d510 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20  Bitmask mThis = 
1d520 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57  (.            pW
1d530 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61  C->a[p->aConstra
1d540 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
1d550 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20  et].prereqRight 
1d560 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20  & ~mPrereq.     
1d570 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1d580 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26  ( mThis>mPrev &&
1d590 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d   mThis<mNext ) m
1d5a0 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20  Next = mThis;.  
1d5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65      }.      mPre
1d5c0 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20  v = mNext;.     
1d5d0 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42   if( mNext==ALLB
1d5e0 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ITS ) break;.   
1d5f0 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42     if( mNext==mB
1d600 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42  est || mNext==mB
1d610 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e  estNoIn ) contin
1d620 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
1d630 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1d640 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76  irtualOne: mPrev
1d650 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30  =%04llx mNext=%0
1d660 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  4llx\n",.       
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1d690 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f  mPrev, (sqlite3_
1d6a0 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a  uint64)mNext));.
1d6b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1d6c0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1d6d0 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  e(.          pBu
1d6e0 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1d6f0 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20 30  mNext|mPrereq, 0
1d700 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1d710 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  In);.      if( p
1d720 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72  New->prereq==mPr
1d730 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ereq ){.        
1d740 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1d750 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30        if( bIn==0
1d760 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20   ) seenZeroNoIN 
1d770 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1d780 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d790 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1d7a0 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20 61  Index() in the a
1d7b0 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f  bove loop did no
1d7c0 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20  t find a plan.  
1d7d0 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72    ** that requir
1d7e0 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62  es no source tab
1d7f0 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e  les at all (i.e.
1d800 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64 20   one guaranteed 
1d810 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73 61  to be.    ** usa
1d820 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c  ble), make a cal
1d830 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c 20  l here with all 
1d840 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64 69  source tables di
1d850 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  sabled */.    if
1d860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d870 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29  && seenZero==0 )
1d880 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1d890 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1d8a0 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73  tualOne: all dis
1d8b0 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20  abled\n"));.    
1d8c0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d8d0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1d8e0 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1d8f0 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65  r, mPrereq, mPre
1d900 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d  req, 0, p, mNoOm
1d910 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1d920 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65   if( bIn==0 ) se
1d930 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1d940 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d950 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42   the calls to xB
1d960 65 73 74 49 6e 64 65 78 28 29 20 68 61 76 65 20  estIndex() have 
1d970 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f  so far failed to
1d980 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20   find a plan.   
1d990 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65   ** that require
1d9a0 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c  s no source tabl
1d9b0 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f  es at all and do
1d9c0 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e  es not use an IN
1d9d0 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65  (...).    ** ope
1d9e0 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69  rator, make a fi
1d9f0 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61  nal call to obta
1da00 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f  in one here.  */
1da10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1da20 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65  ITE_OK && seenZe
1da30 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20  roNoIN==0 ){.   
1da40 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1da50 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1da60 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64  ne: all disabled
1da70 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29   and w/o IN\n"))
1da80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1da90 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1daa0 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1dab0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1dac0 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e  , mPrereq, WO_IN
1dad0 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1dae0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  In);.    }.  }..
1daf0 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46    if( p->needToF
1db00 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
1db10 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53  te3_free(p->idxS
1db20 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
1db30 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64  FreeNN(pParse->d
1db40 62 2c 20 70 29 3b 0a 20 20 70 50 61 72 73 65 2d  b, p);.  pParse-
1db50 3e 64 62 2d 3e 70 42 65 73 74 49 6e 64 65 78 43  >db->pBestIndexC
1db60 74 78 20 3d 20 70 53 61 76 65 64 3b 0a 20 20 72  tx = pSaved;.  r
1db70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1db80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1db90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1dba0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
1dbb0 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
1dbc0 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
1dbd0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
1dbe0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
1dbf0 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
1dc00 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1dc10 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
1dc20 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dOr(.  WhereLoop
1dc30 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1dc40 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  r, .  Bitmask mP
1dc50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61 73  rereq, .  Bitmas
1dc60 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20  k mUnusable.){. 
1dc70 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1dc80 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1dc90 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
1dca0 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
1dcb0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1dcc0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1dcd0 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
1dce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dcf0 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
1dd00 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
1dd10 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
1dd20 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
1dd30 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53  .  WhereOrSet sS
1dd40 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75  um, sCur;.  stru
1dd50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1dd60 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
1dd70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1dd80 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
1dd90 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
1dda0 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
1ddb0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d  der->pNew;.  mem
1ddc0 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69  set(&sSum, 0, si
1ddd0 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70  zeof(sSum));.  p
1dde0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
1ddf0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
1de00 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20  w->iTab;.  iCur 
1de10 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
1de20 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
1de30 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
1de40 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
1de50 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
1de60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1de70 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
1de80 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
1de90 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1dea0 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
1deb0 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
1dec0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
1ded0 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
1dee0 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
1def0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
1df00 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1df10 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
1df20 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
1df30 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
1df40 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
1df50 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
1df60 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
1df70 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
1df80 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
1df90 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
1dfa0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
1dfb0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
1dfc0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65   sSubBuild.pOrSe
1dfd0 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20  t = &sCur;..    
1dfe0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1dff0 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63  00, ("Begin proc
1e000 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
1e010 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
1e020 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
1e030 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
1e040 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
1e050 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
1e060 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
1e070 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e080 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
1e090 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1e0a0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
1e0b0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
1e0c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e0d0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
1e0e0 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
1e0f0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1e100 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
1e110 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
1e120 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
1e130 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
1e140 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
1e150 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1e160 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
1e170 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
1e180 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
1e190 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1e1a0 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
1e1b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e1c0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1e1d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e1e0 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
1e1f0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
1e200 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
1e210 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1e220 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64  00, ("OR-term %d
1e230 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75   of %p has %d su
1e240 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20  bterms:\n", .   
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f  (int)(pOrTerm-pO
1e270 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20  rWC->a), pTerm, 
1e280 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e  sSubBuild.pWC->n
1e290 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
1e2a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
1e2b0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
1e2c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e2d0 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
1e2e0 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57 43  nt(sSubBuild.pWC
1e2f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
1e300 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1e310 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e320 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
1e330 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
1e340 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
1e350 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1e360 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
1e370 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65  SubBuild, mPrere
1e380 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1e390 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
1e3a0 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
1e3b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1e3c0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
1e3d0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1e3e0 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eq);.        }. 
1e3f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1e400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e410 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e420 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42  LoopAddOr(&sSubB
1e430 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d  uild, mPrereq, m
1e440 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20  Unusable);.     
1e450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1e460 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1e470 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
1e480 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1e490 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
1e4a0 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
1e4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1e4c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1e4d0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1e4e0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1e4f0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
1e500 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
1e510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1e520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57  lse{.          W
1e530 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b  hereOrSet sPrev;
1e540 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1e550 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
1e560 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
1e570 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1e580 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1e590 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
1e5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
1e5b0 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
1e5c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1e5d0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
1e5e0 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
1e5f0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
1e600 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e620 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e630 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1e640 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
1e650 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e680 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1e690 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
1e6a0 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
1e6b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e6d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1e6e0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
1e6f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
1e700 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
1e710 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
1e720 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
1e730 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
1e740 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1e750 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1e760 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
1e770 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
1e780 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
1e790 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
1e7a0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1e7b0 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
1e7c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
1e7d0 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c  TUNING: Currentl
1e7e0 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  y sSum.a[i].rRun
1e7f0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
1e800 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  um of the costs.
1e810 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c          ** of al
1e820 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75  l sub-scans requ
1e830 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73  ired by the OR-s
1e840 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75  can. However, du
1e850 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20  e to rounding.  
1e860 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c        ** errors,
1e870 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
1e880 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
1e890 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c  OR-scan is equal
1e8a0 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20   to its.        
1e8b0 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76  ** most expensiv
1e8c0 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20  e sub-scan. Add 
1e8d0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
1e8e0 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20  sible penalty . 
1e8f0 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76         ** (equiv
1e900 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c  alent to multipl
1e910 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79  ying the cost by
1e920 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65   1.07) to ensure
1e930 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a   that .        *
1e940 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  * this does not 
1e950 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73  happen. Otherwis
1e960 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  e, for WHERE cla
1e970 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  uses such as the
1e980 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
1e990 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72  owing where ther
1e9a0 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1e9b0 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a   "y":.        **
1e9c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
1e9d0 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
1e9e0 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79  (x=?, 0.99) OR y
1e9f0 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  =?.        **.  
1ea00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61        ** the pla
1ea10 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74  nner may elect t
1ea20 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20  o "OR" together 
1ea30 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
1ea40 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20  n and an.       
1ea50 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70   ** index lookup
1ea60 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69  . And other simi
1ea70 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74  larly odd result
1ea80 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  s.  */.        p
1ea90 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
1eaa0 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a  .a[i].rRun + 1;.
1eab0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
1eac0 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
1ead0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
1eae0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
1eaf0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
1eb00 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1eb10 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1eb20 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1eb30 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54    }.      WHERET
1eb40 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e  RACE(0x200, ("En
1eb50 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d  d processing OR-
1eb60 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54  clause %p\n", pT
1eb70 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  erm));.    }.  }
1eb80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1eb90 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
1eba0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1ebb0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
1ebc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1ebd0 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
1ebe0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1ebf0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
1ec00 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1ec10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1ec20 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  fo;.  Bitmask mP
1ec30 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69 74  rereq = 0;.  Bit
1ec40 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
1ec50 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
1ec60 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1ec70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1ec80 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1ec90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1eca0 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  m;.  struct SrcL
1ecb0 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d  ist_item *pEnd =
1ecc0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57   &pTabList->a[pW
1ecd0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  Info->nLevel];. 
1ece0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1ecf0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1ed00 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
1ed10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65  LITE_OK;.  Where
1ed20 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38  Loop *pNew;.  u8
1ed30 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1ed40 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   0;..  /* Loop o
1ed50 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
1ed60 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
1ed70 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
1ed80 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  /.  pNew = pBuil
1ed90 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65  der->pNew;.  whe
1eda0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29  reLoopInit(pNew)
1edb0 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20  ;.  for(iTab=0, 
1edc0 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pItem=pTabList->
1edd0 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69  a; pItem<pEnd; i
1ede0 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
1edf0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  .    Bitmask mUn
1ee00 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
1ee10 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
1ee20 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
1ee30 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57  kSelf = sqlite3W
1ee40 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
1ee50 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
1ee60 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1ee70 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d      if( ((pItem-
1ee80 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  >fg.jointype|pri
1ee90 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a  orJointype) & (J
1eea0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
1eeb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
1eec0 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
1eed0 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74  is true when pIt
1eee0 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63  em is the FROM c
1eef0 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68  lause term on th
1ef00 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74  e.      ** right
1ef10 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20  -hand-side of a 
1ef20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1ef30 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50  IN.  */.      mP
1ef40 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a  rereq = mPrior;.
1ef50 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
1ef60 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d  ointype = pItem-
1ef70 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69  >fg.jointype;.#i
1ef80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ef90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1efa0 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
1efb0 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
1efc0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
1efd0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20  cList_item *p;. 
1efe0 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65       for(p=&pIte
1eff0 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  m[1]; p<pEnd; p+
1f000 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1f010 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d  mUnusable || (p-
1f020 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28  >fg.jointype & (
1f030 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1f040 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
1f050 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c  mUnusable |= sql
1f060 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
1f070 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1f080 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b  et, p->iCursor);
1f090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f0a0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68   }.      rc = wh
1f0b0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1f0c0 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  l(pBuilder, mPre
1f0d0 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1f0e0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
1f0f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1f100 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1f110 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
1f120 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1f130 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50  ree(pBuilder, mP
1f140 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20  rereq);.    }.  
1f150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1f170 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1f180 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1f190 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1f1a0 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
1f1b0 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
1f1c0 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
1f1d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f1e0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
1f1f0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
1f200 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
1f210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f220 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
1f230 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
1f240 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
1f250 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
1f260 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70   of the 5th.** p
1f270 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
1f280 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
1f290 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
1f2a0 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
1f2b0 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
1f2c0 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
1f2d0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
1f2e0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
1f2f0 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
1f300 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
1f310 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1f320 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
1f330 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
1f340 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
1f350 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f360 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1f370 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
1f380 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
1f390 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
1f3a0 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
1f3b0 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
1f3c0 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
1f3d0 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
1f3e0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
1f3f0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
1f400 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
1f410 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
1f420 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
1f430 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
1f440 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
1f450 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
1f460 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
1f470 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
1f480 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
1f490 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
1f4a0 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
1f4b0 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
1f4c0 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
1f4d0 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
1f4e0 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
1f4f0 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
1f500 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
1f510 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
1f520 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
1f530 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
1f540 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
1f550 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
1f560 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
1f570 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
1f580 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
1f590 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
1f5a0 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
1f5b0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1f5c0 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
1f5d0 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
1f5e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f5f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
1f600 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1f610 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1f620 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
1f630 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
1f640 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
1f650 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
1f660 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
1f670 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
1f680 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
1f690 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1f6a0 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ,       /* WHERE
1f6b0 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53  _GROUPBY or _DIS
1f6c0 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45  TINCTBY or _ORDE
1f6d0 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75  RBY_LIMIT */.  u
1f6e0 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
1f6f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f700 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
1f710 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
1f720 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
1f730 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
1f740 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
1f750 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
1f760 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
1f770 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
1f780 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
1f790 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
1f7a0 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
1f7b0 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
1f7c0 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
1f7d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f7e0 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
1f7f0 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
1f800 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1f810 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
1f820 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
1f830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f840 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
1f850 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
1f860 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
1f870 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
1f880 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
1f890 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
1f8a0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
1f8b0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1f8c0 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
1f8d0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
1f8e0 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
1f8f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
1f900 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
1f910 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
1f920 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1f930 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20    u16 eqOpMask; 
1f940 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
1f950 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  ed equality oper
1f960 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e  ators */.  u16 n
1f970 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
1f980 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
1f990 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
1f9a0 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
1f9b0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
1f9c0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1f9d0 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
1f9e0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
1f9f0 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
1fa00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1fa10 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
1fa20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fa30 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fa50 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
1fa60 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
1fa70 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1fa80 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1fa90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1faa0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
1fab0 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
1fac0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
1fad0 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
1fae0 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
1faf0 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
1fb00 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
1fb10 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
1fb20 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
1fb30 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1fb40 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
1fb50 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
1fb60 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
1fb70 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1fb80 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1fb90 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1fba0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1fbb0 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
1fbc0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
1fbd0 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
1fbe0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1fbf0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
1fc00 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
1fc10 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
1fc20 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
1fc30 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1fc40 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1fc50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1fc60 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1fc70 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
1fc80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
1fc90 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
1fca0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1fcb0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
1fcc0 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
1fcd0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
1fce0 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
1fcf0 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
1fd00 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
1fd10 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
1fd20 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
1fd30 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
1fd40 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
1fd50 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
1fd60 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
1fd70 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
1fd80 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
1fd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fda0 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
1fdb0 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
1fdc0 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
1fdd0 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
1fde0 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
1fdf0 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
1fe00 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
1fe10 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
1fe20 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
1fe30 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1fe40 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1fe50 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
1fe60 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
1fe70 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
1fe80 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
1fe90 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
1fea0 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
1feb0 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
1fec0 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
1fed0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
1fee0 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
1fef0 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
1ff00 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
1ff10 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
1ff20 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
1ff30 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
1ff40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
1ff50 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
1ff60 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
1ff70 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
1ff80 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
1ff90 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
1ffa0 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
1ffb0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1ffc0 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
1ffd0 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
1ffe0 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
1fff0 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
20000 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
20010 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
20020 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
20030 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
20040 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
20050 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
20060 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
20070 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
20080 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
20090 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
200a0 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
200b0 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
200c0 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
200d0 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
200e0 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
200f0 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
20100 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
20110 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
20120 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
20130 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
20140 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
20150 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
20160 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
20170 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
20180 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
20190 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
201a0 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
201b0 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
201c0 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
201d0 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
201e0 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
201f0 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
20200 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
20210 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
20220 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
20230 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
20240 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
20250 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
20260 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
20270 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  0 );.  if( nLoop
20280 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
20290 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
202a0 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
202b0 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
202c0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
202d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
202e0 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
202f0 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
20300 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
20310 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
20320 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
20330 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
20340 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
20350 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
20360 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
20370 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
20380 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
20390 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
203a0 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70  eady = 0;.  eqOp
203b0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57  Mask = WO_EQ | W
203c0 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c  O_IS | WO_ISNULL
203d0 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ;.  if( wctrlFla
203e0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
203f0 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d  BY_LIMIT ) eqOpM
20400 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20  ask |= WO_IN;.  
20410 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
20420 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
20430 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
20440 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
20450 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
20460 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
20470 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
20480 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  lf;.    if( iLoo
20490 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  p<nLoop ){.     
204a0 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e   pLoop = pPath->
204b0 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
204c0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
204d0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
204e0 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69  BY_LIMIT ) conti
204f0 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nue;.    }else{.
20500 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c        pLoop = pL
20510 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ast;.    }.    i
20520 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
20530 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
20540 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  LTABLE ){.      
20550 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  if( pLoop->u.vta
20560 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62  b.isOrdered ) ob
20570 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20  Sat = obDone;.  
20580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20590 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
205a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
205b0 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
205c0 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  rsor;..    /* Ma
205d0 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52  rk off any ORDER
205e0 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20   BY term X that 
205f0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  is a column in t
20600 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
20610 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ** the current l
20620 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68  oop for which th
20630 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74  ere is term in t
20640 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20  he WHERE.    ** 
20650 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
20660 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20  rm X IS NULL or 
20670 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e  X=? that referen
20680 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20  ce only outer.  
20690 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20    ** loops..    
206a0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
206b0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
206c0 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b  {.      if( MASK
206d0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
206e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
206f0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
20700 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
20710 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
20720 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
20730 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
20740 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
20750 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
20760 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
20770 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
20780 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
20790 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
207a0 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
207b0 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
207c0 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 7e 72 65 61 64 79 2c 20 65 71 4f 70 4d 61    ~ready, eqOpMa
207f0 73 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  sk, 0);.      if
20800 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e  ( pTerm==0 ) con
20810 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
20820 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
20830 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20  r==WO_IN ){.    
20840 20 20 20 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20      /* IN terms 
20850 61 72 65 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66  are only valid f
20860 6f 72 20 73 6f 72 74 69 6e 67 20 69 6e 20 74 68  or sorting in th
20870 65 20 4f 52 44 45 52 20 42 59 20 4c 49 4d 49 54  e ORDER BY LIMIT
20880 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70 74   .        ** opt
20890 69 6d 69 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74  imization, and t
208a0 68 65 6e 20 6f 6e 6c 79 20 69 66 20 74 68 65 79  hen only if they
208b0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
208c0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  ed.        ** by
208d0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
208e0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
208f0 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  t( wctrlFlags & 
20900 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
20910 4d 49 54 20 29 3b 0a 20 20 20 20 20 20 20 20 66  MIT );.        f
20920 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d  or(j=0; j<pLoop-
20930 3e 6e 4c 54 65 72 6d 20 26 26 20 70 54 65 72 6d  >nLTerm && pTerm
20940 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  !=pLoop->aLTerm[
20950 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  j]; j++){}.     
20960 20 20 20 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d     if( j>=pLoop-
20970 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  >nLTerm ) contin
20980 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
20990 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
209a0 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57  perator&(WO_EQ|W
209b0 4f 5f 49 53 29 29 21 3d 30 20 26 26 20 70 4f 42  O_IS))!=0 && pOB
209c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
209d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
209e0 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b  t char *z1, *z2;
209f0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
20a00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
20a10 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
20a20 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
20a30 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
20a40 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
20a50 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
20a60 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
20a70 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  1 = pColl->zName
20a80 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
20a90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
20aa0 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
20ab0 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
20ac0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
20ad0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
20ae0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
20af0 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f          z2 = pCo
20b00 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
20b10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
20b20 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30  rICmp(z1, z2)!=0
20b30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20b40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
20b50 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Term->pExpr->op=
20b60 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
20b70 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d  }.      obSat |=
20b80 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
20b90 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   }..    if( (pLo
20ba0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
20bb0 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29  ERE_ONEROW)==0 )
20bc0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
20bd0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
20be0 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  RE_IPK ){.      
20bf0 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
20c00 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20        nKeyCol = 
20c10 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  0;.        nColu
20c20 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  mn = 1;.      }e
20c30 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20  lse if( (pIndex 
20c40 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
20c50 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70  .pIndex)==0 || p
20c60 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
20c70 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
20c80 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
20c90 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  se{.        nKey
20ca0 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b  Col = pIndex->nK
20cb0 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e  eyCol;.        n
20cc0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
20cd0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
20ce0 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
20cf0 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20  n==nKeyCol+1 || 
20d00 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
20d10 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  ->pTable) );.   
20d20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
20d30 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
20d40 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57  olumn-1]==XN_ROW
20d50 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ID.             
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
20d70 21 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78  !HasRowid(pIndex
20d80 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  ->pTable));.    
20d90 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
20da0 6e 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e  nct = IsUniqueIn
20db0 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  dex(pIndex);.   
20dc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
20dd0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
20de0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
20df0 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
20e00 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
20e10 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
20e20 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
20e30 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
20e40 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
20e50 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
20e60 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
20e70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
20e80 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
20e90 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
20ea0 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20  8 bOnce = 1; /* 
20eb0 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20  True to run the 
20ec0 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20  ORDER BY search 
20ed0 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20  loop */..       
20ee0 20 61 73 73 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f   assert( j>=pLoo
20ef0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 0a  p->u.btree.nEq .
20f00 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
20f10 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
20f20 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e  ==0)==(j<pLoop->
20f30 6e 53 6b 69 70 29 0a 20 20 20 20 20 20 20 20 29  nSkip).        )
20f40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
20f50 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
20f60 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e  Eq && j>=pLoop->
20f70 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  nSkip ){.       
20f80 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4c 6f     u16 eOp = pLo
20f90 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
20fa0 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20 20 20 20  Operator;..     
20fb0 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
20fc0 72 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64 20  r == and IS and 
20fd0 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 20 20 28  ISNULL terms.  (
20fe0 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74 65 72  Also skip IN ter
20ff0 6d 73 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  ms when.        
21000 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48 45 52 45    ** doing WHERE
21010 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 70  _ORDERBY_LIMIT p
21020 72 6f 63 65 73 73 69 6e 67 29 2e 20 0a 20 20 20  rocessing). .   
21030 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
21040 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 75      ** If the cu
21050 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 61 20  rrent term is a 
21060 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 28 28 3f  column of an ((?
21070 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e  ,?) IN (SELECT..
21080 2e 29 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a  .)) .          *
21090 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * expression for
210a0 20 77 68 69 63 68 20 74 68 65 20 53 45 4c 45 43   which the SELEC
210b0 54 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74  T returns more t
210c0 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a  han one column,.
210d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 65            ** che
210e0 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 74 68  ck that it is th
210f0 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75 73  e only column us
21100 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e  ed by this loop.
21110 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
21120 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 69        ** if it i
21130 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20 6f 72 20  s one of two or 
21140 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68  more, none of th
21150 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65  e columns can be
21160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
21170 6e 73 69 64 65 72 65 64 20 74 6f 20 6d 61 74 63  nsidered to matc
21180 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 74 65  h an ORDER BY te
21190 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  rm.  */.        
211a0 20 20 69 66 28 20 28 65 4f 70 20 26 20 65 71 4f    if( (eOp & eqO
211b0 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  pMask)!=0 ){.   
211c0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70           if( eOp
211d0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
211f0 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
21200 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
21210 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
21220 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
21230 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21240 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
21250 3b 20 20 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ;  .          }e
21260 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 65  lse if( ALWAYS(e
21270 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29 7b 0a 20  Op & WO_IN) ){. 
21280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4c             /* AL
21290 57 41 59 53 28 29 20 6a 75 73 74 69 66 69 63 61  WAYS() justifica
212a0 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20 61 6e 20  tion: eOp is an 
212b0 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
212c0 72 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 20  r due to the.   
212d0 20 20 20 20 20 20 20 20 20 2a 2a 20 6a 3c 70 4c           ** j<pL
212e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
212f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 62 6f 76   constraint abov
21300 65 2e 20 20 41 6e 79 20 65 71 75 61 6c 69 74 79  e.  Any equality
21310 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20   other.         
21320 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f 5f 49 4e     ** than WO_IN
21330 20 69 73 20 63 61 70 74 75 72 65 64 20 62 79 20   is captured by 
21340 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 69 66  the previous "if
21350 22 2e 20 20 53 6f 20 74 68 69 73 20 6f 6e 65 0a  ".  So this one.
21360 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
21370 6c 77 61 79 73 20 68 61 73 20 74 6f 20 62 65 20  lways has to be 
21380 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20  WO_IN. */.      
21390 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
213a0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
213b0 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  ]->pExpr;.      
213c0 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31 3b        for(i=j+1;
213d0 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   i<pLoop->u.btre
213e0 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20  e.nEq; i++){.   
213f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
21400 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d  Loop->aLTerm[i]-
21410 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20  >pExpr==pX ){.  
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
21430 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c  sert( (pLoop->aL
21440 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61 74  Term[i]->eOperat
21450 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a 20  or & WO_IN) );. 
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
21470 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
21480 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
214a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
214b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
214c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
214d0 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
214e0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
214f0 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
21500 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
21510 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
21520 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
21530 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
21540 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
21550 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
21560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43   ){.          iC
21570 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
21580 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
21590 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
215a0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
215b0 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
215c0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
215d0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
215e0 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
215f0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
21600 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  e{.          iCo
21610 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
21620 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
21630 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
21640 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
21650 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
21660 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
21670 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
21680 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
21690 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
216a0 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
216b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
216c0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
216d0 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
216e0 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
216f0 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
21700 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
21710 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
21720 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
21730 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
21740 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
21750 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
21760 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
21770 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21780 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
21790 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
217a0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
217b0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
217c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
217d0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72  he index and mar
217e0 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
217f0 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
21800 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 73 4d    */.        isM
21810 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
21820 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65    for(i=0; bOnce
21830 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20   && i<nOrderBy; 
21840 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
21850 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
21860 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
21870 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42  e;.          pOB
21880 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
21890 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
218a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
218b0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pr);.          t
218c0 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
218d0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
218e0 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  PBY );.         
218f0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
21900 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
21910 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20  STINCTBY );.    
21920 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
21930 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47  Flags & (WHERE_G
21940 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53  ROUPBY|WHERE_DIS
21950 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62  TINCTBY))==0 ) b
21960 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Once = 0;.      
21970 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
21980 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
21990 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
219a0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
219b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
219c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
219d0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
219e0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
219f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
21a00 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  BExpr->iColumn!=
21a10 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
21a20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
21a30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21a40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
21a50 43 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c  Compare(pOBExpr,
21a60 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
21a70 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75  ->a[j].pExpr,iCu
21a80 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
21a90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21aa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21ac0 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30    if( iColumn>=0
21ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21ae0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
21af0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
21b00 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
21b10 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
21b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21b30 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
21b40 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
21b50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21b60 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
21b70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
21b80 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  Index->azColl[j]
21b90 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
21ba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21bb0 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d         isMatch =
21bc0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
21bd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
21be0 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74         if( isMat
21bf0 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  ch && (wctrlFlag
21c00 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
21c10 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
21c20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
21c30 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
21c40 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
21c50 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
21c60 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  se..          **
21c70 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69   Sort order is i
21c80 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20  rrelevant for a 
21c90 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
21ca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
21cb0 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20  ( revSet ){.    
21cc0 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
21cd0 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
21ce0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
21cf0 72 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d  rder ) isMatch =
21d00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
21d10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21d20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20   rev = revIdx ^ 
21d30 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
21d40 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
21d50 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20        if( rev ) 
21d60 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53  *pRevMask |= MAS
21d70 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20  KBIT(iLoop);.   
21d80 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20           revSet 
21d90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
21da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21db0 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29     if( isMatch )
21dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
21dd0 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
21de0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
21df0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
21e00 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
21e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
21e20 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
21e30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21e40 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
21e50 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
21e60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21e70 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
21e80 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
21e90 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
21ea0 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
21eb0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21ec0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
21ed0 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
21ee0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
21ef0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
21f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21f10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21f20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
21f30 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
21f40 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
21f50 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
21f60 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
21f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
21f80 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
21f90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
21fa0 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
21fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
21fc0 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
21fd0 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
21fe0 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
21ff0 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
22000 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
22010 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
22020 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
22030 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
22040 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
22050 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
22060 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
22070 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
22080 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
22090 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
220a0 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
220b0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
220c0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
220d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
220e0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
220f0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
22100 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  mTerm = sqlite3W
22110 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70  hereExprUsage(&p
22120 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
22130 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
22140 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c  mTerm==0 && !sql
22150 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
22160 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  nt(p) ) continue
22170 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
22180 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69  Term&~orderDisti
22190 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
221a0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
221b0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
221c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
221d0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
221e0 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
221f0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
22200 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
22210 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
22220 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
22230 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
22240 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20   (i8)nOrderBy;. 
22250 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
22260 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72  tinct ){.    for
22270 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69  (i=nOrderBy-1; i
22280 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
22290 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b  Bitmask m = MASK
222a0 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20  BIT(i) - 1;.    
222b0 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d    if( (obSat&m)=
222c0 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =m ) return i;. 
222d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
222e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
222f0 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  -1;.}.../*.** If
22300 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50   the WHERE_GROUP
22310 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  BY flag is set i
22320 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65  n the mask passe
22330 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
22340 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65  eBegin(),.** the
22350 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73   planner assumes
22360 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66   that the specif
22370 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73  ied pOrderBy lis
22380 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
22390 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75  GROUP.** BY clau
223a0 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20  se - and so any 
223b0 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70  order that group
223c0 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72  s rows as requir
223d0 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65  ed satisfies the
223e0 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  .** request..**.
223f0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20  ** Normally, in 
22400 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
22410 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
22420 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64   the caller to d
22430 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
22440 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
22450 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62  ows are really b
22460 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69  eing delivered i
22470 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
22480 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f  or.** just in so
22490 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74  me other order t
224a0 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65  hat provides the
224b0 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69   required groupi
224c0 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20  ng. However,.** 
224d0 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52  if the WHERE_SOR
224e0 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73  TBYGROUP flag is
224f0 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20   also passed to 
22500 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22510 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  n(), then.** thi
22520 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
22530 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  e called on the 
22540 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e  returned WhereIn
22550 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65  fo object. It re
22560 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66  turns.** true if
22570 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79   the rows really
22580 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20   will be sorted 
22590 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  in the specified
225a0 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65   order, or false
225b0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
225c0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
225d0 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a  , assuming:.**.*
225e0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
225f0 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b   i1 ON t1(x, Y);
22600 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a  .**.** then.**.*
22610 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
22620 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c  M t1 GROUP BY x,
22630 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20  y ORDER BY x,y; 
22640 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
22650 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  =1.**   SELECT *
22660 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42   FROM t1 GROUP B
22670 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79  Y y,x ORDER BY y
22680 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65  ,x;   -- IsSorte
22690 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71  d()==0.*/.int sq
226a0 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
226b0 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ed(WhereInfo *pW
226c0 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28  Info){.  assert(
226d0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
226e0 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
226f0 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PBY );.  assert(
22700 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
22710 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
22720 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74  BYGROUP );.  ret
22730 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  urn pWInfo->sort
22740 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  ed;.}..#ifdef WH
22750 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
22760 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
22770 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
22780 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
22790 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
227a0 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
227b0 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
227c0 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
227d0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
227e0 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
227f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
22800 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
22810 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
22820 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
22830 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
22840 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
22850 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
22860 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
22870 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
22880 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22890 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
228a0 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75   nRow rows, assu
228b0 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65  ming that the ke
228c0 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64  ys have .** nOrd
228d0 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  erby columns and
228e0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
228f0 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20  nSorted columns 
22900 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a  are already in.*
22910 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  * order..*/.stat
22920 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53  ic LogEst whereS
22930 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68  ortingCost(.  Wh
22940 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
22950 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a  .  LogEst nRow,.
22960 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a    int nOrderBy,.
22970 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b    int nSorted.){
22980 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73  .  /* TUNING: Es
22990 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
229a0 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20  a full external 
229b0 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73  sort, where N is
229c0 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65   .  ** the numbe
229d0 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72  r of rows to sor
229e0 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t is:.  **.  ** 
229f0 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
22a00 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a  N * log(N))..  *
22a10 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74  * .  ** Or, if t
22a20 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75  he order-by clau
22a30 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62  se has X terms b
22a40 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74  ut only the last
22a50 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61   Y .  ** terms a
22a60 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c  re out of order,
22a70 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74   then block-sort
22a80 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ing will reduce 
22a90 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e  the .  ** sortin
22aa0 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a  g cost to:.  **.
22ab0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
22ac0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
22ad0 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20   * (Y/X).  **.  
22ae0 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72  ** The (Y/X) ter
22af0 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  m is implemented
22b00 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72   using stack var
22b10 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a  iable rScale.  *
22b20 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c  * below.  */.  L
22b30 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53  ogEst rScale, rS
22b40 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72  ortCost;.  asser
22b50 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26  t( nOrderBy>0 &&
22b60 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
22b70 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63  st(100) );.  rSc
22b80 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ale = sqlite3Log
22b90 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53  Est((nOrderBy-nS
22ba0 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65  orted)*100/nOrde
22bb0 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f  rBy) - 66;.  rSo
22bc0 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20  rtCost = nRow + 
22bd0 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20  rScale + 16;..  
22be0 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c  /* Multiple by l
22bf0 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73  og(M) where M is
22c00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
22c10 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a  utput rows..  **
22c20 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66   Use the LIMIT f
22c30 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d  or M if it is sm
22c40 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28  aller */.  if( (
22c50 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22c60 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c  gs & WHERE_USE_L
22c70 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e  IMIT)!=0 && pWIn
22c80 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20  fo->iLimit<nRow 
22c90 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57  ){.    nRow = pW
22ca0 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  Info->iLimit;.  
22cb0 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d  }.  rSortCost +=
22cc0 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20   estLog(nRow);. 
22cd0 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73   return rSortCos
22ce0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t;.}../*.** Give
22cf0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  n the list of Wh
22d00 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
22d10 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  at pWInfo->pLoop
22d20 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  s, this routine.
22d30 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ** attempts to f
22d40 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
22d50 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69  ost path that vi
22d60 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c  sits each WhereL
22d70 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68  oop.** once.  Th
22d80 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20  is path is then 
22d90 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20  loaded into the 
22da0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f  pWInfo->a[].pWLo
22db0 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  op fields..**.**
22dc0 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   Assume that the
22dd0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
22de0 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61   output rows tha
22df0 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
22e00 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c  e sorted.** will
22e10 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20   be nRowEst (in 
22e20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72  the 10*log2 repr
22e30 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72  esentation).  Or
22e40 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67  , ignore sorting
22e50 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f  .** costs if nRo
22e60 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52  wEst==0..**.** R
22e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22e80 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
22e90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20  LITE_NOMEM of a 
22ea0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
22eb0 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  n.** error occur
22ec0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22ed0 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72   wherePathSolver
22ee0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
22ef0 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45  fo, LogEst nRowE
22f00 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f  st){.  int mxCho
22f10 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ice;            
22f20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
22f30 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f  er of simultaneo
22f40 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64  us paths tracked
22f50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b   */.  int nLoop;
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
22f80 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a  ms in the join *
22f90 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
22fa0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
22fb0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
22fc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
22fd0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22fe0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22ff0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
23000 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
23010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
23020 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74  p counter over t
23030 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
23040 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  join */.  int ii
23050 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  , jj;           
23060 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
23070 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ters */.  int mx
23080 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  I = 0;          
23090 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
230a0 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65  next entry to re
230b0 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  place */.  int n
230c0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
230d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
230e0 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  f ORDER BY claus
230f0 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67  e terms */.  Log
23100 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20  Est mxCost = 0; 
23110 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
23120 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  m cost of a set 
23130 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f  of paths */.  Lo
23140 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20  gEst mxUnsorted 
23150 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d  = 0;    /* Maxim
23160 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74  um unsorted cost
23170 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74   of a set of pat
23180 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  h */.  int nTo, 
23190 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
231a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
231b0 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
231c0 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
231d0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
231e0 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
231f0 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
23200 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
23210 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
23220 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
23230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
23240 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
23250 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
23260 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
23270 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
23280 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
23290 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
232a0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
232b0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
232c0 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
232d0 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
232e0 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
232f0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
23300 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
23310 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
23320 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
23330 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
23340 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
23350 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
23360 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
23370 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
23380 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61  y */.  LogEst *a
23390 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20  SortCost = 0;   
233a0 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20   /* Sorting and 
233b0 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20  partial sorting 
233c0 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  costs */.  char 
233d0 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
233e0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
233f0 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  y memory used by
23400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
23410 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20  .  int nSpace;  
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23430 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  Bytes of space a
23440 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61  llocated at pSpa
23450 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ce */..  pParse 
23460 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
23470 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
23480 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70  >db;.  nLoop = p
23490 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
234a0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20   /* TUNING: For 
234b0 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20  simple queries, 
234c0 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61  only the best pa
234d0 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20  th is tracked.. 
234e0 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f   ** For 2-way jo
234f0 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20  ins, the 5 best 
23500 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77  paths are follow
23510 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69  ed..  ** For joi
23520 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20  ns of 3 or more 
23530 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68  tables, track th
23540 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20  e 10 best paths 
23550 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20  */.  mxChoice = 
23560 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a  (nLoop<=1) ? 1 :
23570 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a   (nLoop==2 ? 5 :
23580 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20   10);.  assert( 
23590 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70  nLoop<=pWInfo->p
235a0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
235b0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
235c0 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69  002, ("---- begi
235d0 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77  n solver.  (nRow
235e0 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77  Est=%d)\n", nRow
235f0 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Est));..  /* If 
23600 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20  nRowEst is zero 
23610 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
23620 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
23630 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74   ignore it. In t
23640 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68  his.  ** case th
23650 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  e purpose of thi
23660 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74  s call is to est
23670 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
23680 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65   of rows returne
23690 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76  d.  ** by the ov
236a0 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63  erall query. Onc
236b0 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20  e this estimate 
236c0 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
236d0 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20  d, the caller.  
236e0 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74  ** will invoke t
236f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73  his function a s
23700 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73  econd time, pass
23710 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65  ing the estimate
23720 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f   as the.  ** nRo
23730 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  wEst parameter. 
23740 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
23750 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
23760 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20   nRowEst==0 ){. 
23770 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b     nOrderBy = 0;
23780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
23790 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d  rderBy = pWInfo-
237a0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
237b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
237c0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
237d0 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
237e0 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f  o, aFrom and aSo
237f0 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53  rtCost[] */.  nS
23800 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57  pace = (sizeof(W
23810 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
23820 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
23830 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
23840 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65    nSpace += size
23850 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
23860 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20  derBy;.  pSpace 
23870 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23880 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63  cRawNN(db, nSpac
23890 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65  e);.  if( pSpace
238a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
238b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
238c0 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61    aTo = (WherePa
238d0 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46  th*)pSpace;.  aF
238e0 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69  rom = aTo+mxChoi
238f0 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72  ce;.  memset(aFr
23900 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46  om, 0, sizeof(aF
23910 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d  rom[0]));.  pX =
23920 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61   (WhereLoop**)(a
23930 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a  From+mxChoice);.
23940 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63    for(ii=mxChoic
23950 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20  e*2, pFrom=aTo; 
23960 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f  ii>0; ii--, pFro
23970 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70  m++, pX += nLoop
23980 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c  ){.    pFrom->aL
23990 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20  oop = pX;.  }.  
239a0 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
239b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
239c0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
239d0 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20  lause and it is 
239e0 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65  not being ignore
239f0 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a  d, set up.    **
23a00 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
23a10 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79  SortCost[] array
23a20 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  . Each element o
23a30 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20  f the aSortCost 
23a40 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20  array.    ** is 
23a50 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65  either zero - me
23a60 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74  aning it has not
23a70 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61   yet been initia
23a80 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20  lized - or the. 
23a90 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f     ** cost of so
23aa0 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f  rting nRowEst ro
23ab0 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65  ws of data where
23ac0 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72   the first X ter
23ad0 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ms of.    ** the
23ae0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23af0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
23b00 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69  order, where X i
23b10 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20  s the array .   
23b20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20   ** index.  */. 
23b30 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28     aSortCost = (
23b40 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20  LogEst*)pX;.    
23b50 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74  memset(aSortCost
23b60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45  , 0, sizeof(LogE
23b70 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b  st) * nOrderBy);
23b80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61  .  }.  assert( a
23b90 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26  SortCost==0 || &
23ba0 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
23bb0 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73  (char*)&aSortCos
23bc0 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20  t[nOrderBy] );. 
23bd0 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f   assert( aSortCo
23be0 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65  st!=0 || &pSpace
23bf0 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a  [nSpace]==(char*
23c00 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65  )pX );..  /* See
23c10 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
23c20 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
23c30 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
23c40 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
23c50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
23c60 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
23c70 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
23c80 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
23c90 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  28.  If the cost
23ca0 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
23cb0 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
23cc0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
23cd0 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
23ce0 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20  e first 28.  ** 
23cf0 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
23d00 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
23d10 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
23d20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
23d30 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
23d40 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73  ryLoop, 48);  as
23d50 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65  sert( 48==sqlite
23d60 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20  3LogEst(28) );. 
23d70 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73   nFrom = 1;.  as
23d80 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69  sert( aFrom[0].i
23d90 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20  sOrdered==0 );. 
23da0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
23db0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70  .    /* If nLoop
23dc0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
23dd0 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d  here are no FROM
23de0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75   terms in the qu
23df0 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  ery. Since.    *
23e00 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74  * in this case t
23e10 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74  he query may ret
23e20 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  urn a maximum of
23e30 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65   one row, the re
23e40 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65  sults.    ** are
23e50 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
23e60 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e  requested order.
23e70 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74   Set isOrdered t
23e80 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20  o nOrderBy to.  
23e90 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68    ** indicate th
23ea0 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70  is. Or, if nLoop
23eb0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
23ec0 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64   zero, set isOrd
23ed0 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d  ered to.    ** -
23ee0 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  1, indicating th
23ef0 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  at the result se
23f00 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  t may or may not
23f10 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20   be ordered, .  
23f20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f    ** depending o
23f30 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65  n the loops adde
23f40 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
23f50 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61   plan.  */.    a
23f60 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
23f70 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31  d = nLoop>0 ? -1
23f80 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d   : nOrderBy;.  }
23f90 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73  ..  /* Compute s
23fa0 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67  uccessively long
23fb0 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73  er WherePaths us
23fc0 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
23fd0 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a   generation.  **
23fe0 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61   of WherePaths a
23ff0 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20  s the basis for 
24000 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20  the next.  Keep 
24010 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43  track of the mxC
24020 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20  hoice.  ** best 
24030 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65  paths at each ge
24040 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f  neration */.  fo
24050 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70  r(iLoop=0; iLoop
24060 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  <nLoop; iLoop++)
24070 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20  {.    nTo = 0;. 
24080 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72     for(ii=0, pFr
24090 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72  om=aFrom; ii<nFr
240a0 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b  om; ii++, pFrom+
240b0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57  +){.      for(pW
240c0 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  Loop=pWInfo->pLo
240d0 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c  ops; pWLoop; pWL
240e0 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78  oop=pWLoop->pNex
240f0 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20  tLoop){.        
24100 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20  LogEst nOut;    
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65    /* Rows visite
24130 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f  d by (pFrom+pWLo
24140 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c  op) */.        L
24150 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20  ogEst rCost;    
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68   /* Cost of path
24180 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
24190 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
241a0 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20  t rUnsorted;    
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
241c0 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  Unsorted cost of
241d0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
241e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73  */.        i8 is
241f0 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
24200 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20  >isOrdered;  /* 
24210 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70  isOrdered for (p
24220 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
24230 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
24240 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20  maskNew;        
24250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
24260 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64  k of src visited
24270 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20   by (..) */.    
24280 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
24290 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ask = 0;        
242a0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
242b0 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73   rev-order loops
242c0 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20   for (..) */..  
242d0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
242e0 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72  p->prereq & ~pFr
242f0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
24300 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24310 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
24320 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72  ->maskSelf & pFr
24330 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30  om->maskLoop)!=0
24340 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24350 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
24360 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
24370 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
24380 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c   && pFrom->nRow<
24390 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  10 ){.          
243a0 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e  /* Do not use an
243b0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
243c0 20 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f   if the this loo
243d0 70 20 69 73 20 65 78 70 65 63 74 65 64 0a 20 20  p is expected.  
243e0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75          ** to ru
243f0 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 20 74 69  n less than 2 ti
24400 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  mes. */.        
24410 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
24420 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
24430 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
24440 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
24450 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
24460 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
24470 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
24480 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
24490 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
244a0 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
244b0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e  t */.        rUn
244c0 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
244d0 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70  LogEstAdd(pWLoop
244e0 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d  ->rSetup,pWLoop-
244f0 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e  >rRun + pFrom->n
24500 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55  Row);.        rU
24510 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
24520 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
24530 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e  rted, pFrom->rUn
24540 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  sorted);.       
24550 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e   nOut = pFrom->n
24560 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f  Row + pWLoop->nO
24570 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  ut;.        mask
24580 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  New = pFrom->mas
24590 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
245a0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
245b0 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c    if( isOrdered<
245c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
245d0 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65  sOrdered = where
245e0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
245f0 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20  erBy(pWInfo,.   
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
24620 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49  erBy, pFrom, pWI
24630 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c  nfo->wctrlFlags,
24640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24650 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70          iLoop, p
24660 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29  WLoop, &revMask)
24670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24680 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
24690 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
246a0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
246b0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
246c0 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64  ered>=0 && isOrd
246d0 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b  ered<nOrderBy ){
246e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
246f0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
24700 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed]==0 ){.      
24710 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
24720 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65  isOrdered] = whe
24730 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24750 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20  WInfo, nRowEst, 
24760 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65  nOrderBy, isOrde
24770 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  red.            
24780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24790 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
247a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
247b0 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f  d(rUnsorted, aSo
247c0 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
247d0 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57  ]);..          W
247e0 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c  HERETRACE(0x002,
247f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
24800 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d  "---- sort cost=
24810 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63  %-3d (%d/%d) inc
24820 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20  reases cost %3d 
24830 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20  to %-3d\n",.    
24840 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
24850 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c  Cost[isOrdered],
24860 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64   (nOrderBy-isOrd
24870 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c  ered), nOrderBy,
24880 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
24890 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73   rUnsorted, rCos
248a0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t));.        }el
248b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43  se{.          rC
248c0 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ost = rUnsorted;
248d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
248e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
248f0 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68  see if pWLoop sh
24900 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f  ould be added to
24910 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20   the set of.    
24920 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20      ** mxChoice 
24930 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
24940 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s..        **.  
24950 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c        ** First l
24960 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
24970 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62  ing path among b
24980 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
24990 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
249a0 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65   covers the same
249b0 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e   set of loops an
249c0 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69  d has the same i
249d0 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
249e0 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74   ** setting as t
249f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20  he current path 
24a00 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20  candidate..     
24a10 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
24a20 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f   The term "((pTo
24a30 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72  ->isOrdered^isOr
24a40 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22  dered)&0x80)==0"
24a50 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20   is equivalent. 
24a60 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54         ** to (pT
24a70 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  o->isOrdered==(-
24a80 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d  1))==(isOrdered=
24a90 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20  =(-1))" for the 
24aa0 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  range.        **
24ab0 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73   of legal values
24ac0 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20   for isOrdered, 
24ad0 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20  -1..64..        
24ae0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
24af0 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
24b00 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
24b10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
24b20 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
24b30 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20  =maskNew.       
24b40 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73      && ((pTo->is
24b50 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65  Ordered^isOrdere
24b60 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20  d)&0x80)==0.    
24b70 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24b80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
24b90 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20  j==nTo-1 );.    
24ba0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
24bb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
24bd0 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
24be0 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66        /* None of
24bf0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65   the existing be
24c00 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20  st-so-far paths 
24c10 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64  match the candid
24c20 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
24c30 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f    if( nTo>=mxCho
24c40 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26  ice.           &
24c50 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  & (rCost>mxCost 
24c60 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73  || (rCost==mxCos
24c70 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d  t && rUnsorted>=
24c80 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20  mxUnsorted)).   
24c90 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
24ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
24cb0 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69  rent candidate i
24cc0 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e  s no better than
24cd0 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68   any of the mxCh
24ce0 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
24cf0 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e   ** paths curren
24d00 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d  tly in the best-
24d10 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20  so-far buffer.  
24d20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20  So discard.     
24d30 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
24d40 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20  andidate as not 
24d50 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65  viable. */.#ifde
24d60 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
24d70 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
24d80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
24d90 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
24da0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
24db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24dc0 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
24dd0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
24de0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
24e10 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
24e20 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
24e30 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
24e40 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
24e50 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
24e60 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
24e70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
24e80 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24e90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
24ea0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
24eb0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
24ec0 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74  oints it means t
24ed0 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64  hat the new cand
24ee0 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20  idate path.     
24ef0 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f       ** needs to
24f00 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
24f10 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d   set of best-so-
24f20 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20  far paths. */.  
24f30 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
24f40 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
24f50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
24f60 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
24f70 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
24f80 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
24f90 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
24fa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
24fc0 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
24fd0 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
24fe0 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
24ff0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
25000 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
25010 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
25020 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
25030 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
25040 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
25050 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
25060 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
25070 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
25080 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
25090 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
250a0 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
250b0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
250c0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
250d0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
250e0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
250f0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
25100 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25120 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
25130 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
25140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
25150 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
25160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
25170 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
25180 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73  s here if best-s
25190 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61  o-far path pTo=a
251a0 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68  To[jj] covers th
251b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
251c0 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73  ame set of loops
251d0 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d   and has the sam
251e0 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69   isOrdered setti
251f0 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ng as the.      
25200 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65      ** candidate
25210 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f   path.  Check to
25220 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64   see if the cand
25230 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70  idate should rep
25240 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  lace.          *
25250 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20  * pTo or if the 
25260 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
25270 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20   be skipped */. 
25280 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
25290 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c  ->rCost<rCost ||
252a0 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43   (pTo->rCost==rC
252b0 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
252c0 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65  <=nOut) ){.#ifde
252d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
252e0 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
252f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
25300 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
25310 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
25320 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25330 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
25340 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
25350 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
25360 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
25390 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
253a0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
253b0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
253c0 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
253d0 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
253e0 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
253f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25400 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
25410 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  vs %s cost=%-3d,
25420 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  %d order=%c\n",.
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
25450 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
25460 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
25470 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
25480 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
25490 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
254a0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
254b0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
254c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
254d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
254e0 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64  scard the candid
254f0 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75  ate path from fu
25500 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74  rther considerat
25510 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
25520 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
25530 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29  ->rCost==rCost )
25540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
25550 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25560 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
25570 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
25580 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20  st==rCost+1 );. 
25590 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
255a0 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65  rol reaches here
255b0 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
255c0 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72  e path is better
255d0 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
255e0 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e      ** pTo path.
255f0 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69    Replace pTo wi
25600 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  th the candidate
25610 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  . */.#ifdef WHER
25620 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
25630 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
25640 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
25650 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
25660 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25670 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
256a0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
256b0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
256c0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
256d0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
256e0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
256f0 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  nOut,.          
25700 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
25710 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
25720 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
25730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25740 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73  bugPrintf("  was
25750 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
25760 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25780 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
25790 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
257a0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
257b0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
257c0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
257d0 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
257e0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
257f0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ?');.          }
25800 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
25810 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c  }.        /* pWL
25820 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e  oop is a winner.
25830 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20    Add it to the 
25840 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66  set of best so f
25850 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54  ar */.        pT
25860 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46  o->maskLoop = pF
25870 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20  rom->maskLoop | 
25880 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
25890 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
258a0 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b  evLoop = revMask
258b0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e  ;.        pTo->n
258c0 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20  Row = nOut;.    
258d0 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d      pTo->rCost =
258e0 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   rCost;.        
258f0 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d  pTo->rUnsorted =
25900 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
25910 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
25920 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a  ed = isOrdered;.
25930 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
25940 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d  To->aLoop, pFrom
25950 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28  ->aLoop, sizeof(
25960 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f  WhereLoop*)*iLoo
25970 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  p);.        pTo-
25980 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20  >aLoop[iLoop] = 
25990 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
259a0 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
259b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
259c0 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xI = 0;.        
259d0 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
259e0 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
259f0 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20     mxUnsorted = 
25a00 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20  aTo[0].nRow;.   
25a10 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
25a20 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
25a30 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
25a40 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
25a50 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
25a60 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20  ost>mxCost .    
25a70 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
25a80 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20  ->rCost==mxCost 
25a90 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65  && pTo->rUnsorte
25aa0 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20  d>mxUnsorted) . 
25ab0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f              mxCo
25ad0 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b  st = pTo->rCost;
25ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
25af0 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d  xUnsorted = pTo-
25b00 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20  >rUnsorted;.    
25b10 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
25b20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  jj;.            
25b30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
25b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25b50 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
25b60 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25b70 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20    /* >=2 */.    
25b80 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25b90 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a  Trace & 0x02 ){.
25ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25bb0 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61  ugPrintf("---- a
25bc0 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d  fter round %d --
25bd0 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20  --\n", iLoop);. 
25be0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70       for(ii=0, p
25bf0 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20  To=aTo; ii<nTo; 
25c00 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  ii++, pTo++){.  
25c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25c20 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f  ugPrintf(" %s co
25c30 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33  st=%-3d nrow=%-3
25c40 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
25c50 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
25c60 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
25c70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
25c80 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
25c90 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
25ca0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70  sOrdered>=0 ? (p
25cb0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
25cc0 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
25cd0 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
25ce0 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  dered>0 ){.     
25cf0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25d00 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
25d10 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
25d20 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
25d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25d40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25d50 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
25d60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25d70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
25d80 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
25d90 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
25da0 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
25db0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
25dc0 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
25dd0 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
25de0 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
25df0 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
25e00 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
25e10 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
25e20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25e30 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
25e40 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
25e50 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
25e60 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
25e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25e80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
25e90 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
25ea0 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
25eb0 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
25ec0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
25ed0 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
25ee0 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
25ef0 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
25f00 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
25f10 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
25f20 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
25f30 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
25f40 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
25f50 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
25f60 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
25f70 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
25f80 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
25f90 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
25fa0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
25fb0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
25fc0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
25fd0 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
25fe0 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
25ff0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
26000 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
26010 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
26020 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
26030 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
26040 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
26050 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
26060 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
26070 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
26080 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
26090 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
260a0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
260b0 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
260c0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
260d0 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
260e0 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
260f0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
26100 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
26110 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
26120 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
26130 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
26140 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
26150 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
26160 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
26170 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
26180 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
26190 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
261a0 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
261b0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
261c0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
261d0 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
261e0 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  c==pWInfo->pResu
261f0 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  ltSet->nExpr ){.
26200 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
26210 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
26220 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
26230 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
26240 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
26250 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57  By ){.    if( pW
26260 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
26270 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
26280 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28  TBY ){.      if(
26290 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
262a0 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  d==pWInfo->pOrde
262b0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
262c0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
262d0 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
262e0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
262f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
26300 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  lse{.      pWInf
26310 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f  o->nOBSat = pFro
26320 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  m->isOrdered;.  
26330 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
26340 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
26350 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  Loop;.      if( 
26360 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d  pWInfo->nOBSat<=
26370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  0 ){.        pWI
26380 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b  nfo->nOBSat = 0;
26390 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 6f  .        if( nLo
263a0 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  op>0 ){.        
263b0 20 20 75 33 32 20 77 73 46 6c 61 67 73 20 3d 20    u32 wsFlags = 
263c0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
263d0 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a  op-1]->wsFlags;.
263e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
263f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
26400 4e 45 52 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20  NEROW)==0 .     
26410 20 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67        && (wsFlag
26420 73 26 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  s&(WHERE_IPK|WHE
26430 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d  RE_COLUMN_IN))!=
26440 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
26450 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20  _COLUMN_IN).    
26460 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26470 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
26480 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
26490 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
264a0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
264b0 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
264c0 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
264d0 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
264e0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
264f0 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e  ORDERBY_LIMIT, n
26500 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
26510 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
26520 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
26530 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
26540 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 3b  s & WHERE_IPK );
26550 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26560 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
26570 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
26580 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
26590 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
265a0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
265b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
265c0 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65   pWInfo->bOrdere
265d0 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a  dInnerLoop = 1;.
265e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
265f0 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
26600 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  m;.            }
26610 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26630 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57     }.    if( (pW
26640 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
26650 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
26660 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26  ROUP).        &&
26670 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d   pWInfo->nOBSat=
26680 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
26690 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f  y->nExpr && nLoo
266a0 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  p>0.    ){.     
266b0 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
266c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
266d0 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61  nOrder = wherePa
266e0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
266f0 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
26700 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20  o->pOrderBy, .  
26710 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30          pFrom, 0
26720 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
26730 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
26740 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20  , &revMask.     
26750 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
26760 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  ( pWInfo->sorted
26770 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
26780 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d   nOrder==pWInfo-
26790 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
267a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
267b0 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a  fo->sorted = 1;.
267c0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
267d0 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73  revMask = revMas
267e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
267f0 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d  .  }...  pWInfo-
26800 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
26810 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
26820 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
26830 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
26840 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
26850 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
26860 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
26870 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26880 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
26890 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
268a0 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
268b0 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
268c0 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
268d0 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
268e0 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
268f0 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
26900 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
26910 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
26920 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
26930 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
26940 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
26950 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
26960 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
26970 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
26980 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
26990 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
269a0 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
269b0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
269c0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
269d0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
269e0 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
269f0 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
26a00 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
26a10 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
26a20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
26a30 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
26a40 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
26a50 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
26a60 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
26a70 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
26a80 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
26a90 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
26aa0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
26ab0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
26ac0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
26ad0 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
26ae0 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
26af0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
26b00 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
26b10 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
26b20 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
26b30 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
26b40 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
26b50 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
26b60 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
26b70 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26b80 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20  _OR_SUBCLAUSE ) 
26b90 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
26ba0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
26bb0 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
26bc0 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
26bd0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
26be0 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
26bf0 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
26c00 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
26c10 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
26c20 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
26c30 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dBy ) return 0;.
26c40 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
26c50 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
26c60 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
26c70 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
26c80 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
26c90 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
26ca0 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20   pLoop->nSkip = 
26cb0 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  0;.  pTerm = sql
26cc0 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
26cd0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
26ce0 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c   0, WO_EQ|WO_IS,
26cf0 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
26d00 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
26d10 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
26d20 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
26d30 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
26d40 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
26d50 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
26d60 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
26d70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
26d80 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
26d90 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
26da0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
26db0 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
26dc0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
26dd0 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
26de0 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
26df0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
26e00 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33    /* 33==sqlite3
26e10 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20  LogEst(10) */.  
26e20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
26e30 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
26e40 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
26e50 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
26e60 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20   int opMask;.   
26e70 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
26e80 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70  ->aLTermSpace==p
26e90 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a  Loop->aLTerm );.
26ea0 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69        if( !IsUni
26eb0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20  queIndex(pIdx). 
26ec0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
26ed0 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
26ee0 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
26ef0 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
26f00 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
26f10 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
26f20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26f30 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75  opMask = pIdx->u
26f40 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f  niqNotNull ? (WO
26f50 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f  _EQ|WO_IS) : WO_
26f60 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  EQ;.      for(j=
26f70 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
26f80 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
26f90 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
26fa0 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
26fb0 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20  WC, iCur, j, 0, 
26fc0 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  opMask, pIdx);. 
26fd0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
26fe0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27000 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27010 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
27020 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
27030 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
27040 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
27050 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  !=pIdx->nKeyCol 
27060 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27070 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
27080 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
27090 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
270a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
270b0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69       if( pIdx->i
270c0 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49  sCovering || (pI
270d0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
270e0 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
270f0 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
27100 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
27110 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
27120 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
27130 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
27140 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
27150 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
27160 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
27170 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
27180 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
27190 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
271a0 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
271b0 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
271c0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
271d0 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
271e0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
271f0 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
27200 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
27210 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
27220 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
27230 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31  nOut = (LogEst)1
27240 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
27250 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
27260 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  p;.    assert( p
27270 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e  WInfo->sMaskSet.
27280 6e 3d 3d 31 20 26 26 20 69 43 75 72 3d 3d 70 57  n==1 && iCur==pW
27290 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2e 69  Info->sMaskSet.i
272a0 78 5b 30 5d 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  x[0] );.    pLoo
272b0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 31 3b  p->maskSelf = 1;
272c0 20 2f 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   /* sqlite3Where
272d0 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
272e0 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
272f0 3b 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ; */.    pWInfo-
27300 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
27310 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
27320 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
27330 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
27340 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
27350 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e  ->nOBSat =  pWIn
27360 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
27370 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  xpr;.    if( pWI
27380 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27390 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
273a0 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
273b0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
273c0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
273d0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
273e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
273f0 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
27400 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
27410 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
27420 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27430 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
27440 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
27450 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
27460 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
27470 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
27480 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
27490 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
274a0 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
274b0 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
274c0 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
274d0 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
274e0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
274f0 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
27500 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
27510 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
27520 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
27530 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
27540 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
27550 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
27560 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
27570 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
27580 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
27590 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
275a0 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
275b0 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
275c0 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
275d0 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
275e0 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
275f0 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
27600 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
27610 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
27620 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
27630 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
27640 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
27650 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
27660 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
27670 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
27680 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
27690 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
276a0 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
276b0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
276c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
276d0 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
276e0 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
276f0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
27700 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
27710 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
27720 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
27730 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
27740 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
27750 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
27760 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
27770 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
27780 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
27790 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
277a0 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
277b0 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
277c0 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
277d0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
277e0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
27800 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
27810 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27830 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
27840 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
27850 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
27860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27870 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
27880 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
27890 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
278a0 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
278b0 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
278c0 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
278d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
278e0 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
278f0 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
27900 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
27910 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
27920 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
27930 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
27940 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
27950 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
27960 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
27970 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
27980 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
27990 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
279a0 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
279b0 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
279c0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
279d0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
279e0 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
279f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
27a00 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
27a10 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
27a20 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
27a30 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
27a40 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
27a50 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
27a60 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
27a70 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
27a80 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
27a90 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
27aa0 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
27ab0 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
27ac0 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
27ad0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
27ae0 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
27af0 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
27b00 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
27b10 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
27b20 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
27b30 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
27b40 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
27b50 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
27b60 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
27b70 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
27b80 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
27b90 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
27ba0 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
27bb0 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
27bc0 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
27bd0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
27be0 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
27bf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
27c00 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
27c10 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
27c20 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
27c30 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
27c40 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
27c50 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
27c60 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
27c70 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
27c80 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
27c90 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
27ca0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
27cb0 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
27cc0 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
27cd0 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
27ce0 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
27cf0 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
27d00 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
27d10 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
27d20 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
27d30 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
27d40 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
27d50 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
27d60 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
27d70 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
27d80 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
27d90 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
27da0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
27db0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
27dc0 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
27dd0 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
27de0 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
27df0 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
27e00 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
27e10 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
27e20 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
27e30 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
27e40 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27e50 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
27e60 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
27e70 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
27e80 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
27e90 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
27ea0 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
27eb0 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
27ec0 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
27ed0 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
27ee0 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
27ef0 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
27f00 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
27f10 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
27f20 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
27f30 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
27f40 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
27f50 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
27f60 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
27f70 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
27f80 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
27f90 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
27fa0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
27fb0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
27fc0 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
27fd0 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
27fe0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
27ff0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
28000 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
28010 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
28020 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
28030 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
28040 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
28050 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
28060 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
28070 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
28080 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
28090 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
280a0 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
280b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
280c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
280d0 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
280e0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
280f0 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
28100 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
28110 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
28120 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
28130 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
28140 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
28150 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
28160 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
28170 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
28180 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
28190 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
281a0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
281b0 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
281c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
281d0 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
281e0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
281f0 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
28200 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   If .** WHERE_OR
28210 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
28220 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68  t, iIdxCur is th
28230 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
28240 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74  of an index.** t
28250 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61  o use for OR cla
28260 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
28270 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
28280 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69  e should use thi
28290 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75  s.** specific cu
282a0 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f  rsor.  If WHERE_
282b0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
282c0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64  is set, then iId
282d0 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66  xCur is.** the f
282e0 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61  irst cursor in a
282f0 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f  n array of curso
28300 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63  rs for all indic
28310 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f  es.  iIdxCur sho
28320 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  uld.** be used t
28330 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70  o compute the ap
28340 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72  propriate cursor
28350 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
28360 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20  ich index is.** 
28370 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  used..*/.WhereIn
28380 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
28390 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
283a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
283b0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
283c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
283d0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
283e0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
283f0 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
28400 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
28410 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
28420 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
28430 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
28440 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
28450 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
28460 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52       /* An ORDER
28470 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
28480 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
28490 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
284a0 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 20 20 2f  *pResultSet,   /
284b0 2a 20 51 75 65 72 79 20 72 65 73 75 6c 74 20 73  * Query result s
284c0 65 74 2e 20 20 52 65 71 27 64 20 66 6f 72 20 44  et.  Req'd for D
284d0 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36  ISTINCT */.  u16
284e0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
284f0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
28500 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
28510 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
28520 20 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78 41 72   */.  int iAuxAr
28530 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
28540 20 49 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   If WHERE_OR_SUB
28550 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69  CLAUSE is set, i
28560 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
28570 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
28590 49 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  If WHERE_USE_LIM
285a0 49 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 6d  IT, then the lim
285b0 69 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a  it amount */.){.
285c0 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
285d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
285e0 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
285f0 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
28600 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
28610 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
28620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28630 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
28640 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
28650 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
28660 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
28670 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
28680 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
28690 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
286a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
286b0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
286c0 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
286d0 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
286e0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
286f0 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
28700 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
28710 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
28720 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
28730 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
28740 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
28750 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
28760 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
28770 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
28780 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
28790 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
287a0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
287b0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
287c0 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
287d0 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65  fo->a[] */.  Whe
287e0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
287f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
28800 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57  er to a single W
28810 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
28820 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
28850 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
28860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28870 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
28880 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
28890 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
288a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
288b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46   code */.  u8 bF
288c0 6f 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20  ordelete = 0;   
288d0 20 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f        /* OPFLAG_
288e0 46 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72  FORDELETE or zer
288f0 6f 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  o, as appropriat
28900 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
28910 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28920 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
28930 49 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20  IROW)==0 || (.  
28940 20 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67        (wctrlFlag
28950 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
28960 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
28970 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
28980 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
28990 42 43 4c 41 55 53 45 29 3d 3d 30 20 0a 20 20 29  BCLAUSE)==0 .  )
289a0 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  );..  /* Only on
289b0 65 20 6f 66 20 57 48 45 52 45 5f 4f 52 5f 53 55  e of WHERE_OR_SU
289c0 42 43 4c 41 55 53 45 20 6f 72 20 57 48 45 52 45  BCLAUSE or WHERE
289d0 5f 55 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20  _USE_LIMIT */.  
289e0 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
289f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
28a00 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20  UBCLAUSE)==0.   
28a10 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
28a20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28a30 55 53 45 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  USE_LIMIT)==0 );
28a40 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20  ..  /* Variable 
28a50 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
28a60 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
28a70 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  >db;.  memset(&s
28a80 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  WLB, 0, sizeof(s
28a90 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  WLB));..  /* An 
28aa0 4f 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63  ORDER/GROUP BY c
28ab0 6c 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68  lause of more th
28ac0 61 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e  an 63 terms cann
28ad0 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ot be optimized 
28ae0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
28af0 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
28b00 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d  rBy->nExpr==BMS-
28b10 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  1 );.  if( pOrde
28b20 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
28b30 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f  >nExpr>=BMS ) pO
28b40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57  rderBy = 0;.  sW
28b50 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
28b60 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69  rderBy;..  /* Di
28b70 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e  sable the DISTIN
28b80 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  CT optimization 
28b90 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  if SQLITE_Distin
28ba0 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61  ctOpt is set via
28bb0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  .  ** sqlite3_te
28bc0 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54  st_ctrl(SQLITE_T
28bd0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
28be0 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20  TIONS,...) */.  
28bf0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
28c00 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
28c10 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29  ITE_DistinctOpt)
28c20 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   ){.    wctrlFla
28c30 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e  gs &= ~WHERE_WAN
28c40 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a  T_DISTINCT;.  }.
28c50 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
28c60 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
28c70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
28c80 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
28c90 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
28ca0 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
28cb0 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
28cc0 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
28cd0 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
28ce0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
28cf0 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
28d00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28d10 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
28d20 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
28d30 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
28d40 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
28d50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
28d60 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
28d70 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
28d80 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
28d90 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
28da0 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
28db0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66  E_OR_SUBCLAUSE f
28dc0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
28dd0 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
28de0 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
28df0 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
28e00 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
28e10 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
28e20 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
28e30 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
28e40 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
28e50 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
28e60 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
28e70 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
28e80 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
28e90 52 5f 53 55 42 43 4c 41 55 53 45 29 20 3f 20 31  R_SUBCLAUSE) ? 1
28ea0 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   : pTabList->nSr
28eb0 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  c;..  /* Allocat
28ec0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
28ed0 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
28ee0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
28ef0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20  ll become the.  
28f00 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ** return value.
28f10 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   A single alloca
28f20 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
28f30 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49  store the WhereI
28f40 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c  nfo.  ** struct,
28f50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
28f60 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20   WhereInfo.a[], 
28f70 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
28f80 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
28f90 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b  nd the WhereMask
28fa0 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53  Set structure. S
28fb0 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65  ince WhereClause
28fc0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62   contains an 8-b
28fd0 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28  yte.  ** field (
28fe0 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74  type Bitmask) it
28ff0 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64   must be aligned
29000 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   on an 8-byte bo
29010 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73  undary on.  ** s
29020 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ome architecture
29030 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55  s. Hence the ROU
29040 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a  ND8() below..  *
29050 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  /.  nByteWInfo =
29060 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
29070 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
29080 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
29090 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
290a0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
290b0 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
290c0 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
290d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
290e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
290f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
29100 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
29110 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
29120 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
29130 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
29140 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
29150 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
29160 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
29170 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
29180 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
29190 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
291a0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72  .  pWInfo->pWher
291b0 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 57  e = pWhere;.  pW
291c0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
291d0 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
291e0 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
291f0 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
29200 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
29210 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
29220 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
29230 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
29240 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d  iBreak = pWInfo-
29250 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  >iContinue = sql
29260 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
29270 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
29280 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
29290 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
292a0 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78  o->iLimit = iAux
292b0 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  Arg;.  pWInfo->s
292c0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
292d0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
292e0 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  oop;.  memset(&p
292f0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30  WInfo->nOBSat, 0
29300 2c 20 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73  , .         offs
29310 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73  etof(WhereInfo,s
29320 57 43 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57  WC) - offsetof(W
29330 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29  hereInfo,nOBSat)
29340 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49  );.  memset(&pWI
29350 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  nfo->a[0], 0, si
29360 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b  zeof(WhereLoop)+
29370 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28  nTabList*sizeof(
29380 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
29390 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
293a0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
293b0 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45  S_OFF );  /* ONE
293c0 50 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f  PASS defaults to
293d0 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53   OFF */.  pMaskS
293e0 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d  et = &pWInfo->sM
293f0 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70  askSet;.  sWLB.p
29400 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
29410 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57    sWLB.pWC = &pW
29420 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c  Info->sWC;.  sWL
29430 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c  B.pNew = (WhereL
29440 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57  oop*)(((char*)pW
29450 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f  Info)+nByteWInfo
29460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
29470 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
29480 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a  T(sWLB.pNew) );.
29490 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
294a0 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64  sWLB.pNew);.#ifd
294b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
294c0 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64    sWLB.pNew->cId
294d0 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a   = '*';.#endif..
294e0 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
294f0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
29500 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
29510 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
29520 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
29530 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
29540 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
29550 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
29560 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
29570 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  Set);.  sqlite3W
29580 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
29590 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
295a0 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  nfo);.  sqlite3W
295b0 68 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66  hereSplit(&pWInf
295c0 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20  o->sWC, pWhere, 
295d0 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
295e0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
295f0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
29600 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
29610 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
29620 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
29630 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
29640 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
29650 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
29660 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  u..  */.  for(ii
29670 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d  =0; ii<sWLB.pWC-
29680 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
29690 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d     if( nTabList=
296a0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
296b0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
296c0 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  in(sWLB.pWC->a[i
296d0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
296e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
296f0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 73 57  False(pParse, sW
29700 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
29710 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  xpr, pWInfo->iBr
29720 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eak,.           
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
29740 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
29750 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70 57 43  ;.      sWLB.pWC
29760 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20  ->a[ii].wtFlags 
29770 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
29780 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
29790 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
297a0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
297b0 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
297c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
297d0 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
297e0 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65 72  >nOBSat = pOrder
297f0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
29800 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
29810 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
29820 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
29830 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
29840 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
29850 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
29860 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
29870 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
29880 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
29890 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
298a0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
298b0 2a 20 54 68 65 20 4e 2d 74 68 20 74 65 72 6d 20  * The N-th term 
298c0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
298d0 73 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  se is assigned a
298e0 20 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e   bitmask of 1<<N
298f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
29900 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76  rule of the prev
29910 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e  ious sentence en
29920 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58 20  sures thta if X 
29930 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
29940 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  or.  ** a table 
29950 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20 74  T, then X-1 is t
29960 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
29970 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ll other tables 
29980 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 54  to the left of T
29990 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74  ..  ** Knowing t
299a0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
299b0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
299c0 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
299d0 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20 69 6d 70  join is.  ** imp
299e0 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
299f0 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
29a00 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61   Note that bitma
29a10 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20  sks are created 
29a20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74  for all pTabList
29a30 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e  ->nSrc tables in
29a40 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20  .  ** pTabList, 
29a50 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72  not just the fir
29a60 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c  st nTabList tabl
29a70 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73  es.  nTabList is
29a80 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65   normally.  ** e
29a90 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74  qual to pTabList
29aa0 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74  ->nSrc but might
29ab0 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f   be shortened to
29ac0 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57   1 if the.  ** W
29ad0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
29ae0 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  E flag is set.. 
29af0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
29b00 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
29b10 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72  c; ii++){.    cr
29b20 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eateMask(pMaskSe
29b30 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
29b40 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
29b50 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62   sqlite3WhereTab
29b60 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c  FuncArgs(pParse,
29b70 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69   &pTabList->a[ii
29b80 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  ], &pWInfo->sWC)
29b90 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
29ba0 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
29bb0 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
29bc0 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
29bd0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
29be0 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d  sqlite3WhereGetM
29bf0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
29c00 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
29c10 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65  ursor);.    asse
29c20 72 74 28 20 6d 3d 3d 4d 41 53 4b 42 49 54 28 69  rt( m==MASKBIT(i
29c30 69 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  i) );.  }.#endif
29c40 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
29c50 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
29c60 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73  ressions. */.  s
29c70 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41  qlite3WhereExprA
29c80 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
29c90 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a   &pWInfo->sWC);.
29ca0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
29cb0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
29cc0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
29cd0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
29ce0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
29cf0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66  STINCT ){.    if
29d00 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  ( isDistinctRedu
29d10 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54  ndant(pParse, pT
29d20 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
29d30 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74  >sWC, pResultSet
29d40 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
29d50 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69  e DISTINCT marki
29d60 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e  ng is pointless.
29d70 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a    Ignore it. */.
29d80 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
29d90 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
29da0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
29db0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
29dc0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
29dd0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52      /* Try to OR
29de0 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c  DER BY the resul
29df0 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69  t set to make di
29e00 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e  stinct processin
29e10 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20  g easier */.    
29e20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
29e30 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49  lags |= WHERE_DI
29e40 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20  STINCTBY;.      
29e50 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
29e60 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
29e70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
29e80 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65  onstruct the Whe
29e90 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
29ea0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  /.#if defined(WH
29eb0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
29ec0 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  ).  if( sqlite3W
29ed0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 66 66  hereTrace & 0xff
29ee0 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ff ){.    sqlite
29ef0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a  3DebugPrintf("**
29f00 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
29f10 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67  t *** (wctrlFlag
29f20 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c  s: 0x%x",wctrlFl
29f30 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63  ags);.    if( wc
29f40 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29f50 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _USE_LIMIT ){.  
29f60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
29f70 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a  Printf(", limit:
29f80 20 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a   %d", iAuxArg);.
29f90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29fa0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c  3DebugPrintf(")\
29fb0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n");.  }.  if( s
29fc0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
29fd0 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44   & 0x100 ){ /* D
29fe0 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73  isplay all terms
29ff0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2a000 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ause */.    sqli
2a010 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
2a020 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20  int(sWLB.pWC);. 
2a030 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2a040 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
2a050 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
2a060 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
2a070 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2a080 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
2a090 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
2a0a0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2a0b0 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52   .#ifdef WHERETR
2a0c0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2a0d0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2a0e0 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44  Trace ){    /* D
2a0f0 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
2a100 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2a110 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  cts */.      Whe
2a120 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
2a130 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
2a140 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2a150 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
2a160 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
2a170 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
2a180 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a1b0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2a1c0 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
2a1d0 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
2a1e0 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
2a1f0 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
2a200 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
2a210 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
2a220 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
2a230 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
2a240 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42  oopPrint(p, sWLB
2a250 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pWC);.      }. 
2a260 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
2a270 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
2a280 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
2a290 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2a2a0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2a2b0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2a2c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2a2d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2a2e0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
2a2f0 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
2a300 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
2a310 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2a320 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2a330 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2a340 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
2a350 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
2a360 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
2a370 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2a380 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
2a390 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
2a3a0 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49 54 53  evMask = ALLBITS
2a3b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
2a3c0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
2a3d0 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
2a3e0 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
2a3f0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2a400 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
2a410 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2a420 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2a430 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  eTrace ){.    sq
2a440 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a450 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20  ("---- Solution 
2a460 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f  nRow=%d", pWInfo
2a470 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
2a480 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
2a490 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  at>0 ){.      sq
2a4a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a4b0 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78  (" ORDERBY=%d,0x
2a4c0 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  %llx", pWInfo->n
2a4d0 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72  OBSat, pWInfo->r
2a4e0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  evMask);.    }. 
2a4f0 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66     switch( pWInf
2a500 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a  o->eDistinct ){.
2a510 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
2a520 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
2a530 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
2a540 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2a550 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75    DISTINCT=uniqu
2a560 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  e");.        bre
2a570 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2a580 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
2a590 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
2a5a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a5b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
2a5c0 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22  ISTINCT=ordered"
2a5d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2a5e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a5f0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
2a600 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b  NCT_UNORDERED: {
2a610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a620 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
2a630 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65  ISTINCT=unordere
2a640 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
2a650 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2a660 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
2a670 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
2a680 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2a690 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
2a6a0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68   ii++){.      wh
2a6b0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49  ereLoopPrint(pWI
2a6c0 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f  nfo->a[ii].pWLoo
2a6d0 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
2a6e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2a6f0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f   /* Attempt to o
2a700 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20  mit tables from 
2a710 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f  the join that do
2a720 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20   not effect the 
2a730 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20  result */.  if( 
2a740 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
2a750 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53  2.   && pResultS
2a760 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  et!=0.   && Opti
2a770 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2a780 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e  db, SQLITE_OmitN
2a790 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20  oopJoin).  ){.  
2a7a0 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65    Bitmask tabUse
2a7b0 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  d = sqlite3Where
2a7c0 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
2a7d0 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53  askSet, pResultS
2a7e0 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c  et);.    if( sWL
2a7f0 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  B.pOrderBy ){.  
2a800 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73      tabUsed |= s
2a810 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
2a820 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
2a830 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  t, sWLB.pOrderBy
2a840 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  );.    }.    whi
2a850 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  le( pWInfo->nLev
2a860 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57  el>=2 ){.      W
2a870 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
2a880 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c   *pEnd;.      pL
2a890 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  oop = pWInfo->a[
2a8a0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
2a8b0 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
2a8c0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61  if( (pWInfo->pTa
2a8d0 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
2a8e0 69 54 61 62 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  iTab].fg.jointyp
2a8f0 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
2a900 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
2a910 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2a920 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2a930 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20  INCT)==0.       
2a940 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  && (pLoop->wsFla
2a950 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2a960 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  W)==0.      ){. 
2a970 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2a980 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a990 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70  (tabUsed & pLoop
2a9a0 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29  ->maskSelf)!=0 )
2a9b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45   break;.      pE
2a9c0 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61  nd = sWLB.pWC->a
2a9d0 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   + sWLB.pWC->nTe
2a9e0 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  rm;.      for(pT
2a9f0 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b  erm=sWLB.pWC->a;
2aa00 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65   pTerm<pEnd; pTe
2aa10 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
2aa20 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
2aa30 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
2aa40 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20  skSelf)!=0.     
2aa50 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
2aa60 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
2aa70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
2aa80 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  n).        ){.  
2aa90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2aaa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2aab0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2aac0 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20  <pEnd ) break;. 
2aad0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
2aae0 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f  0xffff, ("-> dro
2aaf0 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73  p loop %c not us
2ab00 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49  ed\n", pLoop->cI
2ab10 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  d));.      pWInf
2ab20 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20  o->nLevel--;.   
2ab30 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20     nTabList--;. 
2ab40 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45     }.  }.  WHERE
2ab50 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
2ab60 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
2ab70 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
2ab80 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
2ab90 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20  ->nQueryLoop += 
2aba0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b  pWInfo->nRowOut;
2abb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
2abc0 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
2abd0 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2abe0 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
2abf0 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
2ac00 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
2ac10 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
2ac20 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
2ac30 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
2ac40 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
2ac50 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ac60 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2ac70 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
2ac80 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
2ac90 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2aca0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2acb0 53 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  SIRED)!=0 ){.   
2acc0 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 70   int wsFlags = p
2acd0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
2ace0 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
2acf0 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28   int bOnerow = (
2ad00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ad10 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20  ONEROW)!=0;.    
2ad20 69 66 28 20 62 4f 6e 65 72 6f 77 0a 20 20 20 20  if( bOnerow.    
2ad30 20 7c 7c 20 28 28 77 63 74 72 6c 46 6c 61 67 73   || ((wctrlFlags
2ad40 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2ad50 5f 4d 55 4c 54 49 52 4f 57 29 21 3d 30 0a 20 20  _MULTIROW)!=0.  
2ad60 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 28           && 0==(
2ad70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ad80 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 0a 20  VIRTUALTABLE)). 
2ad90 20 20 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e     ){.      pWIn
2ada0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62  fo->eOnePass = b
2adb0 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53  Onerow ? ONEPASS
2adc0 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53  _SINGLE : ONEPAS
2add0 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69  S_MULTI;.      i
2ade0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
2adf0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  List->a[0].pTab)
2ae00 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57   && (wsFlags & W
2ae10 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
2ae20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63  {.        if( wc
2ae30 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2ae40 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
2ae50 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  W ){.          b
2ae60 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c  Fordelete = OPFL
2ae70 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20  AG_FORDELETE;.  
2ae80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ae90 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
2aea0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  oop->wsFlags = (
2aeb0 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45  wsFlags & ~WHERE
2aec0 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  _IDX_ONLY);.    
2aed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2aee0 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
2aef0 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
2af00 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
2af10 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
2af20 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
2af30 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2af40 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  */.  for(ii=0, p
2af50 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2af60 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
2af70 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2af80 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
2af90 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
2afa0 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
2afb0 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
2afc0 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
2afd0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
2afe0 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  le/index */.    
2aff0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2b000 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a  tem *pTabItem;..
2b010 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
2b020 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2b030 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
2b040 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
2b050 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
2b060 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
2b070 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
2b080 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c  pSchema);.    pL
2b090 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
2b0a0 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
2b0b0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2b0c0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
2b0d0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
2b0e0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t ){.      /* Do
2b0f0 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
2b100 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  }else.#ifndef SQ
2b110 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2b120 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28  LTABLE.    if( (
2b130 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2b140 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2b150 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
2b160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54   const char *pVT
2b170 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
2b180 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61   *)sqlite3GetVTa
2b190 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
2b1a0 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20       int iCur = 
2b1b0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2b1c0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2b1d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2b1e0 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c  _VOpen, iCur, 0,
2b1f0 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54   0, pVTab, P4_VT
2b200 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  AB);.    }else i
2b210 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
2b220 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  b) ){.      /* n
2b230 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  oop */.    }else
2b240 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2b250 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2b260 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2b270 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2b280 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2b290 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2b2a0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  E)==0 ){.      i
2b2b0 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
2b2c0 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ead;.      if( p
2b2d0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21  WInfo->eOnePass!
2b2e0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
2b2f0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2b300 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
2b310 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
2b320 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61  OnePass[0] = pTa
2b330 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
2b340 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73        };.      s
2b350 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
2b360 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
2b370 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
2b380 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
2b390 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
2b3a0 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76  m->iCursor==pLev
2b3b0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20  el->iTabCur );. 
2b3c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2b3d0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2b3e0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
2b3f0 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  pTab->nCol==BMS-
2b400 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
2b410 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ase( pWInfo->eOn
2b420 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2b430 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2b440 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
2b450 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2b460 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2b470 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
2b480 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70  MS && HasRowid(p
2b490 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2b4a0 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
2b4b0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
2b4c0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
2b4d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
2b4e0 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
2b4f0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2b500 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
2b510 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f   -1, SQLITE_INT_
2b520 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
2b530 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
2b540 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
2b550 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Col );.      }.#
2b560 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2b570 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
2b580 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
2b590 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2b5a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
2b5b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b5c0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45  P5(v, OPFLAG_SEE
2b5d0 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b  KEQ|bFordelete);
2b5e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2b5f0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
2b600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2b610 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64  hangeP5(v, bFord
2b620 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  elete);.      }.
2b630 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2b640 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2b650 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69  _MASK.      sqli
2b660 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
2b670 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
2b680 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  sed, pTabItem->i
2b690 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20  Cursor, 0, 0,.  
2b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6b0 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
2b6c0 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e   u8*)&pTabItem->
2b6d0 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36  colUsed, P4_INT6
2b6e0 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  4);.#endif.    }
2b6f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2b700 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2b710 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2b720 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2b730 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
2b740 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2b750 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
2b760 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
2b770 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
2b780 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
2b790 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65  .      int iInde
2b7a0 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  xCur;.      int 
2b7b0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
2b7c0 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41  ;.      /* iAuxA
2b7d0 72 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  rg is always set
2b7e0 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69 76   if to a positiv
2b7f0 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41  e value if ONEPA
2b800 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a  SS is possible *
2b810 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b820 69 41 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70  iAuxArg!=0 || (p
2b830 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2b840 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2b850 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b  S_DESIRED)==0 );
2b860 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52  .      if( !HasR
2b870 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 49 73  owid(pTab) && Is
2b880 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
2b890 70 49 78 29 0a 20 20 20 20 20 20 20 26 26 20 28  pIx).       && (
2b8a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b8b0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2b8c0 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  !=0.      ){.   
2b8d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
2b8e0 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f  one term of an O
2b8f0 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75  R-optimization u
2b900 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  sing the PRIMARY
2b910 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20   KEY of a.      
2b920 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57    ** WITHOUT ROW
2b930 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65  ID table.  No ne
2b940 65 64 20 66 6f 72 20 61 20 73 65 70 61 72 61 74  ed for a separat
2b950 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
2b960 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70     iIndexCur = p
2b970 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a  Level->iTabCur;.
2b980 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a          op = 0;.
2b990 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b9a0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2b9b0 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
2b9c0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2b9d0 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  pJ = pTabItem->p
2b9e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
2b9f0 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
2ba00 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20   iAuxArg;.      
2ba10 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
2ba20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2ba30 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a  PASS_DESIRED );.
2ba40 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 41          while( A
2ba50 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21  LWAYS(pJ) && pJ!
2ba60 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20  =pIx ){.        
2ba70 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20    iIndexCur++;. 
2ba80 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a           pJ = pJ
2ba90 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
2baa0 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20   }.        op = 
2bab0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
2bac0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69        pWInfo->ai
2bad0 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
2bae0 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
2baf0 20 7d 65 6c 73 65 20 69 66 28 20 69 41 75 78 41   }else if( iAuxA
2bb00 72 67 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  rg && (wctrlFlag
2bb10 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2bb20 43 4c 41 55 53 45 29 21 3d 30 20 29 7b 0a 20 20  CLAUSE)!=0 ){.  
2bb30 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2bb40 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20  = iAuxArg;.     
2bb50 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65     op = OP_Reope
2bb60 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nIdx;.      }els
2bb70 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  e{.        iInde
2bb80 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
2bb90 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Tab++;.      }. 
2bba0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
2bbb0 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72  xCur = iIndexCur
2bbc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2bbd0 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
2bbe0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
2bbf0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e       assert( iIn
2bc00 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20  dexCur>=0 );.   
2bc10 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20     if( op ){.   
2bc20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bc30 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49  AddOp3(v, op, iI
2bc40 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  ndexCur, pIx->tn
2bc50 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
2bc60 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
2bc70 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
2bc80 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20  , pIx);.        
2bc90 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2bca0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53  ags & WHERE_CONS
2bcb0 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20  TRAINT)!=0.     
2bcc0 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
2bcd0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2bce0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
2bcf0 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30  RE_SKIPSCAN))==0
2bd00 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
2bd10 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2bd20 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
2bd30 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  IN)==0.        )
2bd40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2bd50 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2bd60 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  v, OPFLAG_SEEKEQ
2bd70 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f  ); /* Hint to CO
2bd80 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  MDB2 */.        
2bd90 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  }.        VdbeCo
2bda0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2bdb0 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69  pIx->zName));.#i
2bdc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2bdd0 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
2bde0 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ASK.        {.  
2bdf0 20 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55          u64 colU
2be00 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sed = 0;.       
2be10 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20     int ii, jj;. 
2be20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
2be30 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75  0; ii<pIx->nColu
2be40 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  mn; ii++){.     
2be50 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d         jj = pIx-
2be60 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20  >aiColumn[ii];. 
2be70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
2be80 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  j<0 ) continue;.
2be90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bea0 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b  jj>63 ) jj = 63;
2beb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2bec0 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55   (pTabItem->colU
2bed0 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a  sed & MASKBIT(jj
2bee0 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
2bef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
2bf00 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31  lUsed |= ((u64)1
2bf10 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a  )<<(ii<63 ? ii :
2bf20 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   63);.          
2bf30 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2bf40 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
2bf50 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
2bf60 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20  sed, iIndexCur, 
2bf70 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf90 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55        (u8*)&colU
2bfa0 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  sed, P4_INT64);.
2bfb0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2bfc0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
2bfd0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
2bfe0 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  SK */.      }.  
2bff0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
2c000 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  =0 ) sqlite3Code
2c010 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2c020 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  rse, iDb);.  }. 
2c030 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
2c040 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2c050 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
2c060 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2c070 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2c080 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
2c090 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
2c0a0 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
2c0b0 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
2c0c0 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
2c0d0 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
2c0e0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
2c0f0 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
2c100 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
2c110 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
2c120 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
2c130 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
2c140 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61  for(ii=0; ii<nTa
2c150 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  bList; ii++){.  
2c160 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
2c170 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  n;.    int wsFla
2c180 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  gs;.    pLevel =
2c190 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b   &pWInfo->a[ii];
2c1a0 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70  .    wsFlags = p
2c1b0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
2c1c0 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20  sFlags;.#ifndef 
2c1d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2c1e0 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
2c1f0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c  if( (pLevel->pWL
2c200 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2c210 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
2c220 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2c230 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
2c240 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57  ndex(pParse, &pW
2c250 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20  Info->sWC,.     
2c260 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62             &pTab
2c270 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2c280 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79  iFrom], notReady
2c290 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , pLevel);.     
2c2a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c2b0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2c2c0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2c2d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
2c2e0 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c  ddrExplain = sql
2c2f0 69 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e  ite3WhereExplain
2c300 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20  OneScan(.       
2c310 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73   pParse, pTabLis
2c320 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70  t, pLevel, ii, p
2c330 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63  Level->iFrom, wc
2c340 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a  trlFlags.    );.
2c350 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
2c360 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
2c370 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2c380 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  ;.    notReady =
2c390 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64   sqlite3WhereCod
2c3a0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
2c3b0 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61  Info, ii, notRea
2c3c0 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
2c3d0 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65  >iContinue = pLe
2c3e0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20  vel->addrCont;. 
2c3f0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 26     if( (wsFlags&
2c400 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d  WHERE_MULTI_OR)=
2c410 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  =0 && (wctrlFlag
2c420 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  s&WHERE_OR_SUBCL
2c430 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AUSE)==0 ){.    
2c440 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64    sqlite3WhereAd
2c450 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70  dScanStatus(v, p
2c460 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2c470 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20   addrExplain);. 
2c480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
2c490 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  one. */.  VdbeMo
2c4a0 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
2c4b0 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72  "Begin WHERE-cor
2c4c0 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e"));.  return p
2c4d0 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
2c4e0 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
2c4f0 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
2c500 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
2c510 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
2c520 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2c530 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
2c540 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
2c550 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
2c560 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
2c570 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2c580 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2c590 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
2c5a0 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
2c5b0 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
2c5c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2c5d0 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
2c5e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2c5f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
2c600 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
2c610 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
2c620 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
2c630 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
2c640 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2c650 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2c660 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
2c670 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  evel;.  WhereLoo
2c680 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c  p *pLoop;.  SrcL
2c690 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
2c6a0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2c6b0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2c6c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2c6d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
2c6e0 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
2c6f0 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d  de..  */.  VdbeM
2c700 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2c710 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65   "End WHERE-core
2c720 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  "));.  sqlite3Ex
2c730 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2c740 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
2c750 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
2c760 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2c770 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
2c780 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2c790 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
2c7a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2c7b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2c7c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2c7d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2c7e0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
2c7f0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
2c800 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c810 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c  VdbeAddOp3(v, pL
2c820 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
2c830 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
2c840 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20  , pLevel->p3);. 
2c850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c860 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
2c870 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56  el->p5);.      V
2c880 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2c890 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2c8a0 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2c8b0 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20  op==OP_Next);.  
2c8c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2c8d0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2c8e0 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
2c8f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2c900 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
2c910 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d  OP_VNext);.    }
2c920 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
2c930 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c940 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
2c950 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
2c960 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
2c970 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
2c980 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
2c990 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2c9a0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2c9b0 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
2c9c0 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
2c9d0 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
2c9e0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
2c9f0 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
2ca00 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
2ca10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2ca20 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
2ca30 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
2ca40 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 65 45       if( pIn->eE
2ca50 6e 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f  ndLoopOp!=OP_Noo
2ca60 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  p ){.          s
2ca70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ca80 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2ca90 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  pOp, pIn->iCur, 
2caa0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
2cab0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
2cac0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2cad0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2cae0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
2caf0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76  dLoopOp==OP_Prev
2cb00 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
2cb10 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2cb20 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2cb30 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f  opOp==OP_NextIfO
2cb40 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pen);.        }.
2cb50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2cb60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
2cb70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
2cb80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2cb90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2cba0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2cbb0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
2cbc0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2cbd0 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20  >addrSkip ){.   
2cbe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
2cbf0 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  to(v, pLevel->ad
2cc00 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56  drSkip);.      V
2cc10 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2cc20 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f  next skip-scan o
2cc30 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  n %s", pLoop->u.
2cc40 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
2cc50 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
2cc60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2cc70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2cc80 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Skip);.      sql
2cc90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2cca0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2ccb0 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23  Skip-2);.    }.#
2ccc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49  ifndef SQLITE_LI
2ccd0 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f  KE_DOESNT_MATCH_
2cce0 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70 4c  BLOBS.    if( pL
2ccf0 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
2cd00 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
2cd10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2cd20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
2cd30 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69   (int)(pLevel->i
2cd40 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c  LikeRepCntr>>1),
2cd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cd60 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
2cd70 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20  >addrLikeRep);. 
2cd80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2cd90 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  e(v);.    }.#end
2cda0 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  if.    if( pLeve
2cdb0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
2cdc0 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
2cdd0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
2cde0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
2cdf0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2ce00 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
2ce10 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56  l->iLeftJoin); V
2ce20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2ce30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 77        assert( (w
2ce40 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2ce50 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20  LY)==0 || (ws & 
2ce60 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2ce70 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
2ce80 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
2ce90 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
2cea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ceb0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
2cec0 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
2ced0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2cee0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
2cef0 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
2cf00 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  ED) .       || (
2cf10 28 77 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  (ws & WHERE_MULT
2cf20 49 5f 4f 52 29 20 26 26 20 70 4c 65 76 65 6c 2d  I_OR) && pLevel-
2cf30 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a 20 20 20  >u.pCovidx) .   
2cf40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
2cf50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2cf60 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
2cf70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
2cf80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2cf90 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
2cfa0 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
2cfb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cfc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2cfd0 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
2cfe0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
2cff0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2d000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d010 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
2d020 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
2d030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2d040 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2d050 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
2d060 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
2d070 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
2d080 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
2d090 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20  ", i,.          
2d0a0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
2d0b0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2d0c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54  Level->iFrom].pT
2d0d0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
2d0e0 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
2d0f0 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
2d100 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
2d110 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
2d120 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
2d130 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
2d140 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2d150 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
2d160 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74  reak);..  assert
2d170 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2d180 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  <=pTabList->nSrc
2d190 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
2d1a0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2d1b0 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
2d1c0 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
2d1d0 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61  ){.    int k, la
2d1e0 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  st;.    VdbeOp *
2d1f0 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  pOp;.    Index *
2d200 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
2d210 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2d220 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
2d230 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2d240 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
2d250 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
2d260 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2d270 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2d280 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
2d290 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
2d2a0 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f  .    /* For a co
2d2b0 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65  -routine, change
2d2c0 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72   all OP_Column r
2d2d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2d2e0 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
2d2f0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
2d300 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20  into OP_Copy of 
2d310 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64  result contained
2d320 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a   in a register..
2d330 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20      ** OP_Rowid 
2d340 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e  becomes OP_Null.
2d350 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d360 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
2d370 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
2d380 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
2d390 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2d3a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 74  ailed );.      t
2d3b0 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
2d3c0 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 4c 65  Copy(pParse, pLe
2d3d0 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70  vel->addrBody, p
2d3e0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a  Level->iTabCur,.
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d400 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2d410 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
2d420 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69   0);.      conti
2d430 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
2d440 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
2d450 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
2d460 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73 75  ake VDBE code su
2d470 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
2d480 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
2d490 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
2d4a0 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74  nstead of from t
2d4b0 68 65 20 74 61 62 6c 65 20 77 68 65 72 65 20 70  he table where p
2d4c0 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d  ossible.  In som
2d4d0 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74  e cases.    ** t
2d4e0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2d4f0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 74 61   prevents the ta
2d500 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65  ble from ever be
2d510 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68 20  ing read, which 
2d520 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64  can.    ** yield
2d530 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70   a significant p
2d540 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
2d550 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
2d560 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f   Calls to the co
2d570 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  de generator in 
2d580 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57  between sqlite3W
2d590 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20  hereBegin and.  
2d5a0 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
2d5b0 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63  eEnd will have c
2d5c0 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74  reated code that
2d5d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
2d5e0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72  table.    ** dir
2d5f0 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f  ectly.  This loo
2d600 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74  p scans all that
2d610 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   code looking fo
2d620 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a  r opcodes.    **
2d630 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
2d640 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  the table and co
2d650 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f  nverts them into
2d660 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20   opcodes that.  
2d670 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74    ** reference t
2d680 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
2d690 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
2d6a0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
2d6b0 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49  _INDEXED|WHERE_I
2d6c0 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20  DX_ONLY) ){.    
2d6d0 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
2d6e0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
2d6f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
2d700 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2d710 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
2d720 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
2d730 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b  evel->u.pCovidx;
2d740 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d750 49 64 78 0a 20 20 20 20 20 26 26 20 28 70 57 49  Idx.     && (pWI
2d760 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2d770 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48  NEPASS_OFF || !H
2d780 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54  asRowid(pIdx->pT
2d790 61 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20 21  able)).     && !
2d7a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d7b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c 61  .    ){.      la
2d7c0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
2d7d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2d7e0 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c        k = pLevel
2d7f0 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20 20  ->addrBody;.    
2d800 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
2d810 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a  dbeGetOp(v, k);.
2d820 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61        for(; k<la
2d830 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
2d840 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
2d850 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
2d860 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
2d870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
2d880 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
2d890 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2d8a0 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70    int x = pOp->p
2d8b0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  2;.          ass
2d8c0 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62 6c  ert( pIdx->pTabl
2d8d0 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  e==pTab );.     
2d8e0 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
2d8f0 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
2d900 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2d910 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
2d920 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
2d930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
2d940 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
2d950 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [x];.           
2d960 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
2d970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d980 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74         x = sqlit
2d990 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
2d9a0 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20  pIdx, x);.      
2d9b0 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
2d9c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
2d9d0 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  >p2 = x;.       
2d9e0 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
2d9f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
2da00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2da10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2da20 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2da30 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2da40 3d 30 20 7c 7c 20 78 3e 3d 30 20 0a 20 20 20 20  =0 || x>=0 .    
2da50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49            || pWI
2da60 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 29 3b  nfo->eOnePass );
2da70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2da80 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2da90 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
2daa0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
2dab0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2dac0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
2dad0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52  opcode = OP_IdxR
2dae0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
2daf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2db00 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c  }..  /* Final cl
2db10 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61  eanup.  */.  pPa
2db20 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
2db30 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
2db40 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65  QueryLoop;.  whe
2db50 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
2db60 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
2db70 3b 0a 7d 0a                                      ;.}.