/ Hex Artifact Content
Login

Artifact 7e4d676b5ac4434e5f93606a744d396dc40d9977:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
1950: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
1960: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
1970: 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70  = pScan->aiCur[p
1980: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
1990: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
19a0: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
19b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
19c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
19d0: 3d 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63  ==XN_EXPR && pSc
19e0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20  an->pIdxExpr==0 
19f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a00: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
1a10: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
1a20: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a30: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a40: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a60: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a70: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a80: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a90: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1aa0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1ab0: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1ac0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ad0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ae0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1af0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1b00: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1b10: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b20: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b30: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b40: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b50: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1ba0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1bb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1bc0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bd0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1be0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bf0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1c00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c20: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c50: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c60: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c80: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1ca0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1cb0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1cc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d40: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d60: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d70: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1da0: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1dd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1de0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e00: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1e10: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e30: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e40: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e50: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e70: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1eb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ec0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1f00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1f10: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f20: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f70: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1fa0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1fb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ff0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
2000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2010: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2020: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2030: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2060: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2070: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2100: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
2110: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2130: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2140: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2150: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2160: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2170: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2180: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2190: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21c0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
2200: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
2210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2220: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
2230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2240: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
2250: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
2260: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2270: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
2280: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
2290: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
22a0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
22b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
22c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
22e0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
22f0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2310: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2320: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2330: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2340: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2360: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2370: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2380: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2390: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
23a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
23b0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
23c0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
23d0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
23e0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
23f0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2400: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2410: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2420: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2430: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2440: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2450: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2460: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2470: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2480: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2490: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
24a0: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
24b0: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
24c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24d0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
24e0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
24f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2500: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2510: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2520: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2530: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2540: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2550: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2560: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2570: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2580: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2590: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
25a0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
25b0: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
25c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
25d0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
25e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
25f0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2600: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2610: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2620: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2630: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2640: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2650: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2660: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2670: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2680: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
26b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
26f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2700: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2710: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2720: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
2730: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
2740: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2750: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2760: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2770: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2780: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2790: 0a 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  .){.  int j = 0;
27a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
27b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
27c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
27d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
27e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
27f0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2800: 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20  >pIdxExpr = 0;. 
2810: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2820: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2830: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2850: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2860: 58 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d  XN_EXPR ) pScan-
2870: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2880: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
28a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
28b0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
28c0: 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
28d0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  D;.  }.  if( pId
28e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
28f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
2900: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
2910: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
2930: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2940: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2950: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2960: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2970: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2980: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2990: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
29a0: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
29b0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
29c0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
29d0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
29e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
29f0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2a00: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2a10: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2a20: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2a30: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2a50: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a70: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2a80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2a90: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2aa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ab0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2ac0: 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20  able iCur or of 
2ad0: 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66  index pIdx.** if
2ae0: 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70   pIdx!=0 and <op
2af0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  > is one of the 
2b00: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
2b10: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
2b20: 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61  y.** the op para
2b30: 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61  meter.  Return a
2b40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b50: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
2b60: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2b70: 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74  .** If pIdx!=0 t
2b80: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f  hen it must be o
2b90: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2ba0: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2bb0: 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72    .** Search for
2bc0: 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20   terms matching 
2bd0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2be0: 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a  olumn of pIdx.**
2bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
2c00: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
2c10: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2c30: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
2c40: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
2c50: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
2c60: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
2c70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c80: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
2c90: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
2ca0: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
2cb0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
2cc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
2cd0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
2ce0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
2cf0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
2d00: 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75  * aiCur[]/iaColu
2d10: 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64  mn[] arrays hold
2d20: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
2d30: 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72  quivalents. Ther
2d40: 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74  e are 11.** slot
2d50: 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43  s in aiCur[]/aiC
2d60: 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20  olumn[] so that 
2d70: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
2d80: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
2d90: 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65  to 10.** other e
2da0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
2db0: 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  .  Hence a searc
2dc0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
2dd0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
2de0: 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20  A1.** and A1=A2 
2df0: 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e  and A2=A3 and ..
2e00: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
2e10: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
2e20: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
2e30: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
2e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2e50: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
2e60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
2e70: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
2e80: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
2e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
2ea0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
2eb0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
2ec0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
2ed0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
2ee0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
2ef0: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
2f00: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
2f10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
2f20: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
2f30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
2f40: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
2f50: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
2f60: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
2f70: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
2f80: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
2f90: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
2fa0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
2fb0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
2fc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
2fd0: 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54  EQUIV..*/.WhereT
2fe0: 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72  erm *sqlite3Wher
2ff0: 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  eFindTerm(.  Whe
3000: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3010: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3020: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3030: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3040: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3050: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3060: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3070: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3080: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3090: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
30a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
30c0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
30d0: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
30e0: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3100: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3110: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3120: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3130: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3140: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3150: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3160: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3170: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3180: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
3190: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
31a0: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
31b0: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
31c0: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
31d0: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
31e0: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
31f0: 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f    op &= WO_EQ|WO
3200: 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  _IS;.  while( p 
3210: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ){.    if( (p->p
3220: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3230: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
3240: 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
3250: 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e  Right==0 && (p->
3260: 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30  eOperator&op)!=0
3270: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
3280: 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74  case( p->eOperat
3290: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
32a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
32b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c0: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
32d0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
32e0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
32f0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
3300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3310: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  sult;.}../*.** T
3320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
3330: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
3340: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
3350: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
3360: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
3370: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
3380: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
3390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
33a0: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
33b0: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
33c0: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
33d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
33e0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
33f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3400: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
3410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3450: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
3460: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3470: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
3480: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
3490: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b0: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
34c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
34d0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
34e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3500: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
3510: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
3520: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3540: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
3550: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
3560: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3570: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
3580: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
3590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
35a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
35b0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
35c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
35d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
35e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
35f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3600: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
3610: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
3620: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
3630: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3640: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
3650: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3670: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
3680: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3690: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
36a0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
36b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
36c0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
36d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
36e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3710: 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c  TRUE if the iCol
3720: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
3730: 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20  dex pIdx is NOT 
3740: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
3750: 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  nt indexColumnNo
3760: 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64  tNull(Index *pId
3770: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
3780: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
3790: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73   pIdx!=0 );.  as
37a0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
37b0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
37c0: 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64  umn );.  j = pId
37d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
37e0: 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b  ];.  if( j>=0 ){
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78  .    return pIdx
3800: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
3810: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c  ].notNull;.  }el
3820: 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29  se if( j==(-1) )
3830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3850: 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a  ert( j==(-2) );.
3860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
3870: 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65  * Assume an inde
3880: 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63  xed expression c
3890: 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20  an always yield 
38a0: 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d  a NULL */..  }.}
38b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
38c0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
38d0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
38e0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
38f0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3900: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3910: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3920: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3930: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3940: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3960: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3970: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3980: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3990: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
39a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
39b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
39c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
39f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3a00: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3a10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3a20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a30: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3a40: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3a50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3a60: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3a70: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3a80: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3a90: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3aa0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3ab0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
3ac0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
3af0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
3b00: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3b10: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3b20: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3b30: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3b40: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3b50: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3b60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3b70: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3b80: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3b90: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3ba0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
3bb0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
3bc0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
3bd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3be0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
3bf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3c00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3c10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3c20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3c30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3c40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3c50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3c60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3c70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3c80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3c90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3ca0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
3cb0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
3cc0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
3cd0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3ce0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
3cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3d00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3d10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3d20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3d40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3d50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3d60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3d70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3d90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3da0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
3db0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
3dc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
3dd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
3de0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3df0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
3e00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3e10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3e20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3e30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3e40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3e50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3e60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3e70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3e80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3e90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3ea0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3eb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
3ec0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
3ed0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
3ee0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
3ef0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
3f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3f10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3f20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3f30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3f40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3f50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3f60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3f70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3f80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3f90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3fa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3fb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
3fc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
3fd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
3fe0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
3ff0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4000: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
4010: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4020: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
4030: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4040: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
4050: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
4060: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4070: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
4080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4090: 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46  0==sqlite3WhereF
40a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
40b0: 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b  se, i, ~(Bitmask
40c0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
40d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
40e0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
40f0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
4100: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c  iBase, pIdx, i)<
4110: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4120: 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75     if( indexColu
4130: 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  mnNotNull(pIdx, 
4140: 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i)==0 ) break;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4160: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
4170: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
4180: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
4190: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
41a0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
41b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
41c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
41e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
41f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
4200: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
4210: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
4220: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
4230: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
4240: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
4250: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
4260: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
4270: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
4280: 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d  Convert OP_Colum
4290: 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f  n opcodes to OP_
42a0: 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73  Copy in previous
42b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ly generated cod
42c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
42d0: 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20  utine runs over 
42e0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
42f0: 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74  ode and translat
4300: 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20  es OP_Column.** 
4310: 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f  opcodes into OP_
4320: 43 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61  Copy when the ta
4330: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63  ble is being acc
4340: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
4350: 74 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64  tine .** instead
4360: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4370: 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  okup..**.** If t
4380: 68 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61  he bIncrRowid pa
4390: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
43a0: 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20  en any OP_Rowid 
43b0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a  instructions on.
43c0: 2a 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75  ** cursor iTabCu
43d0: 72 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  r are transforme
43e0: 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20  d into OP_Null. 
43f0: 4f 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69  Or, if bIncrRowi
4400: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  d is non-zero,.*
4410: 2a 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52  * then each OP_R
4420: 6f 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72  owid is transfor
4430: 6d 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  med into an inst
4440: 72 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65  ruction to incre
4450: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ment the.** valu
4460: 65 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20  e stored in its 
4470: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e  output register.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
44a0: 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76  oCopy(.  Vdbe *v
44b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
44c0: 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e  The VDBE contain
44d0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e  ing code to tran
44e0: 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  slate */.  int i
44f0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4500: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4520: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4530: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4540: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4550: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4560: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4570: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4580: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4590: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
45a0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
45c0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
45d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
45e0: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
45f0: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4600: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
4610: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4620: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4630: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4650: 64 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20  ddr(v);.  for(; 
4660: 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74  iStart<iEnd; iSt
4670: 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  art++, pOp++){. 
4680: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
4690: 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
46a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ue;.    if( pOp-
46b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
46c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  mn ){.      pOp-
46d0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
46e0: 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  y;.      pOp->p1
46f0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65   = pOp->p2 + iRe
4700: 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f  gister;.      pO
4710: 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b  p->p2 = pOp->p3;
4720: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  .      pOp->p3 =
4730: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
4740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4750: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
4760: 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20   if( bIncrRowid 
4770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
4780: 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
4790: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
47a0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P2 operand of th
47b0: 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20  e OP_Rowid. */. 
47c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
47d0: 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a  de = OP_AddImm;.
47e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
47f0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4800: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a     pOp->p2 = 1;.
4810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4820: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4830: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
4840: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b      pOp->p1 = 0;
4850: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
4860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4880: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
4890: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
48a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
48b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
48c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
48d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
48e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
48f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
4900: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
4910: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
4920: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
4930: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
4940: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
4950: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4970: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
4980: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
4990: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
49a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
49b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
49c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
49d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
49e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
49f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4a00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4a10: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4a20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4a30: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
4a40: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
4a50: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
4a60: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
4a70: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4a80: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4a90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4aa0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4ab0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
4ac0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4ad0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
4ae0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4af0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
4b00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4b10: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4b30: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4b40: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
4b50: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
4b60: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4b70: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
4b80: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
4b90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
4ba0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
4bb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
4bc0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
4bd0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
4be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
4bf0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4c10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4c20: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4c30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c40: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
4c50: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
4c60: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4c70: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4c80: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
4c90: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
4ca0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4cb0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
4cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
4cd0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
4ce0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
4cf0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
4d00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d10: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
4d20: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
4d30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
4d50: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
4d60: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
4d70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4d80: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
4d90: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
4da0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
4dd0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
4de0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
4df0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
4e00: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
4e10: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
4e20: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
4e30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
4e50: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
4e60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e80: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
4e90: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
4ea0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
4eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
4ec0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
4ed0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
4ee0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
4ef0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
4f00: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
4f10: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
4f20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
4f50: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
4f60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4f70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
4f80: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
4f90: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
4fa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4fb0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
4fc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
4fd0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
4fe0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
4ff0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
5000: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5010: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
5020: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
5030: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
5040: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
5050: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75  O_IS))==0 ) retu
5060: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5070: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5080: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
5090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
50a0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
50b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
50c0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
50d0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
50e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
50f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
5100: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5110: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
5120: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
5130: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
5140: 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
5150: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
5160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5170: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
5180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5190: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
51a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
51b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
51c0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
51d0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
51e0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
51f0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
5200: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
5210: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
5220: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
5230: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
5240: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
5270: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
5280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
52a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
52b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
52c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
52d0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
52e0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
52f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5300: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
5310: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
5320: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
5330: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
5340: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
5350: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
5360: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
5370: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
5380: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5390: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
53a0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
53b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
53c0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
53d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
53e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
53f0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
5400: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
5410: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
5430: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
5440: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5450: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
5460: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
5470: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
5480: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
5490: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
54a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
54b0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
54c0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
54d0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
5500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
5510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
5520: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
5530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5540: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
5550: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
5560: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
5570: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
5580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5590: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
55a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
55b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
55c0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
55d0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
55e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
55f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5600: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5610: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
5620: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
5650: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5680: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5690: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
56b0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
56c0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
56d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56f0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5700: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
5710: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
5720: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
5730: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
5740: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
5750: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
5760: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5770: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
5780: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
5790: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
57a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
57b0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
57c0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
57d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
57e0: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
57f0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
5800: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5810: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
5820: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
5830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
5840: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
5850: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
5860: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
5870: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5880: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
5890: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
58a0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
58b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
58c0: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
58d0: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  uded rows */.  s
58e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58f0: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5900: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
5910: 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  rm being indexed
5920: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
5930: 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  unter = 0;      
5940: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65    /* Address whe
5950: 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74  re integer count
5960: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5970: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5980: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
59a0: 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72  egisters where r
59b0: 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c  ecord is assembl
59c0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
59d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
59e0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
59f0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
5a00: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
5a10: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
5a20: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
5a30: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
5a40: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
5a50: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5a70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
5a80: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
5a90: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
5aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5ab0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5ad0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
5ae0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
5af0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
5b00: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
5b10: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
5b20: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
5b30: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
5b40: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
5b50: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
5b60: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
5b70: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
5b80: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
5b90: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5ba0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5bb0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5bc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
5bd0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
5bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5c00: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
5c10: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
5c20: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
5c30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5c40: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
5c50: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
5c60: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
5c70: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
5c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
5c90: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
5ca0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
5cb0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
5cc0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
5cd0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
5ce0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
5cf0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
5d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
5d10: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
5d20: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5d30: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
5d40: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
5d50: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
5d60: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
5d70: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
5d80: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
5d90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
5da0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
5db0: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5de0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5df0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
5e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
5e10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
5e20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
5e30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
5e40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
5e50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
5e60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
5e70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
5e80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
5e90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
5ea0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5eb0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
5ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5ed0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5ee0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
5ef0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
5f00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5f10: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
5f20: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
5f30: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
5f40: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
5f50: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
5f60: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
5f70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
5f80: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
5f90: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5fb0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
5fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
5fd0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
5fe0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
5ff0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
6000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
6010: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6020: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
6040: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
6050: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
6060: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
6070: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
6080: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6090: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
60a0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
60b0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
60c0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
60d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
60e0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
60f0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
6100: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
6110: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
6120: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
6130: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
6140: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
6150: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
6160: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6170: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
6180: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
6190: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
61a0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
61b0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
61c0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
61d0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
61e0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
61f0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
6200: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
6210: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6220: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
6230: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
6240: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
6250: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
6260: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
6270: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
6280: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
6290: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
62a0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
62b0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
62c0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
62d0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
62e0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
62f0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
6300: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
6310: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
6320: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
6330: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
6340: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
6350: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
6360: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
6370: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
6380: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
6390: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
63a0: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
63b0: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
63c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
63d0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
63e0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
63f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
6400: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
6410: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
6420: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
6430: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
6440: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
6450: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
6460: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
6470: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
6480: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
6490: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
64a0: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
64b0: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
64c0: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
64d0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
64e0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
64f0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
6500: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6510: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
6520: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
6530: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
6540: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
6550: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
6560: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
6570: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
6580: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
6590: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
65a0: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
65b0: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
65c0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
65d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
65e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
65f0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
6600: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
6610: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
6620: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
6630: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6640: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
6650: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6660: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
6670: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
6680: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
6690: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
66a0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
66b0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
66c0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
66d0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
66e0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
66f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6700: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
6710: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
6720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
6730: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
6740: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
6750: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6760: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
6770: 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65  ->zName : sqlite
6780: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6790: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
67a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
67b0: 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
67c0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
67d0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
67e0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
67f0: 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
6800: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6810: 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
6820: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
6830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
6840: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
6850: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
6860: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a  & MASKBIT(i) ){.
6870: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6880: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6890: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
68a0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
68b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
68c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
68d0: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
68e0: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
68f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
6900: 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
6910: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6920: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6930: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6940: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6950: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6960: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6970: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
6980: 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20   n==nKeyCol );. 
6990: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
69a0: 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  n] = XN_ROWID;. 
69b0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
69d0: 41 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ARY;..  /* Creat
69e0: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
69f0: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
6a00: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
6a10: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
6a20: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
6a30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
6a60: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
6a70: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
6a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6a90: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
6aa0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
6ab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
6ac0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
6ad0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
6ae0: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
6af0: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
6b00: 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tent */.  sqlite
6b10: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
6b20: 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74  Parse);.  pTabIt
6b30: 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66  em = &pWC->pWInf
6b40: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
6b50: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
6b60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6b70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6b80: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
6b90: 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
6ba0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64  egReturn;.    ad
6bb0: 64 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  drCounter = sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6bd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6be0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c00: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
6c10: 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
6c20: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
6c30: 62 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  b);.    addrTop 
6c40: 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
6c50: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
6c60: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
6c70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6c80: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
6c90: 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
6ca0: 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
6cb0: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
6cc0: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
6cd0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
6ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cf0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
6d10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61   }.  if( pPartia
6d30: 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e  l ){.    iContin
6d40: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
6d50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
6d70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61  alse(pParse, pPa
6d80: 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65  rtial, iContinue
6d90: 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
6da0: 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  ULL);.    pLoop-
6db0: 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
6dc0: 45 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20  E_PARTIALIDX;.  
6dd0: 7d 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  }.  regRecord = 
6de0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6df0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6e00: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
6e10: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a  nerateIndexKey(.
6e20: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49        pParse, pI
6e30: 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
6e40: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
6e50: 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  0, 0, 0, 0.  );.
6e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e70: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6e80: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
6e90: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
6ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
6eb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6ec0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
6ed0: 3b 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  ;.  if( pPartial
6ee0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
6ef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
6f00: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
6f10: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6f20: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6f30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f40: 67 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e  geP2(v, addrCoun
6f50: 74 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b  ter, regBase+n);
6f60: 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f  .    translateCo
6f70: 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64  lumnToCopy(v, ad
6f80: 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  drTop, pLevel->i
6f90: 54 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d  TabCur, pTabItem
6fa0: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
6fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6fc0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
6fd0: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
6fe0: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6ff0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7010: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
7020: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
7030: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
7040: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7050: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
7060: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
7070: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
7080: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
7090: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
70a0: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
70b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
70c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
70d0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
70e0: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
70f0: 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
7100: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7110: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
7120: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
7130: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7140: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
7150: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
7160: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
7170: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7180: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7190: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
71a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
71b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
71c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
71d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
71e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
71f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
7220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
7230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
7240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
7250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
7260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
7270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
72a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
72b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
72c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
72d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
72e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
72f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
7300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d  use *pWC,.  Bitm
7310: 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20  ask mUnusable,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7330: 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68  gnore terms with
7340: 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a   these prereqs *
7350: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7360: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20  st_item *pSrc,. 
7370: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7380: 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  rBy.){.  int i, 
7390: 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  j;.  int nTerm;.
73a0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
73b0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
73c0: 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
73d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
73e0: 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64  dex_orderby *pId
73f0: 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75  xOrderBy;.  stru
7400: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7410: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7420: 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
7430: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
7440: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
7450: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7460: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a  nfo *pIdxInfo;..
7470: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
7480: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
7490: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
74a0: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
74b0: 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
74c0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
74d0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
74e0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
74f0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7500: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7510: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
7520: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
7530: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
7540: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
7550: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7560: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
7570: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7580: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
7590: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
75a0: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
75b0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
75c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
75d0: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
75e0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
75f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7600: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7610: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7620: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7630: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7640: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7650: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
7660: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
7670: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
7680: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
7690: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f  |WO_IS))==0 ) co
76a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
76b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
76c0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
76d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
76e0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
76f0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
7700: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
7710: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
7720: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
7730: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
7740: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
7750: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
7760: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
7770: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7780: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
7790: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
77a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
77b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
77c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
77d0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
77e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
77f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
7800: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
7820: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7830: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7850: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7860: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
7870: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7890: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
78a0: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
78b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
78c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
78d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
78e0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
78f0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
7900: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7910: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
7920: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
7930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7940: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
7950: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
7960: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
7970: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
79a0: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
79b0: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
79c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
79d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
79e0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
79f0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
7a00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7a10: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
7a20: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
7a30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
7a50: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
7a60: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
7a70: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
7a80: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
7a90: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
7aa0: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
7ab0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
7ac0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
7ad0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
7ae0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
7af0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
7b00: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
7b10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7b30: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
7b40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
7b50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b60: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
7b70: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
7b80: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
7b90: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7ba0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7bb0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
7bc0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
7bd0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7be0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
7bf0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
7c00: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
7c10: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
7c20: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7c30: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7c40: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
7c50: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
7c60: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
7c70: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7c80: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
7c90: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
7ca0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
7cb0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7cc0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7cd0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
7ce0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
7cf0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
7d40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
7d50: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7d60: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7d70: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
7d80: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
7d90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7da0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7db0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7dc0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
7dd0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
7de0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
7df0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
7e00: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
7e10: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7e20: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7e30: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7e40: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7e50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7e60: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7e70: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7e80: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7e90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ea0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
7eb0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7ec0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7ed0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
7ee0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7ef0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
7f00: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
7f10: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7f20: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7f30: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7f40: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7f50: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7f60: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7f70: 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78  (-1) );.    pIdx
7f80: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
7f90: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
7fa0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
7fb0: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
7fc0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
7fd0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
7fe0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
7ff0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8000: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8010: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d      if( op==WO_M
8020: 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70  ATCH ){.      op
8030: 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68   = pTerm->eMatch
8040: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  Op;.    }.    pI
8050: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
8060: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
8070: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8080: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8090: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
80a0: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
80b0: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
80c0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
80d0: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
80e0: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
80f0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
8100: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
8110: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
8120: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
8130: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8140: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8150: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8160: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
8170: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
8180: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8190: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
81a0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
81b0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
81c0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
81d0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
81e0: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
81f0: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
8200: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8210: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
8220: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
8230: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8240: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
8250: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8260: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
8270: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
8280: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8290: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
82a0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
82b0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
82c0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
82d0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
82e0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
82f0: 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
8300: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
8310: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
8320: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
8330: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
8340: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
8350: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8360: 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
8370: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
8380: 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
8390: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
83a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
83b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
83c0: 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
83d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
83e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
83f0: 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
8400: 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
8410: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
8420: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
8430: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8440: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
8450: 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
8460: 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
8470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8480: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8490: 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
84a0: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
84b0: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
84c0: 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
84d0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
84e0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
84f0: 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
8500: 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
8510: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
8520: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8530: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8540: 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
8550: 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
8560: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
8570: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
8580: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
8590: 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
85a0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
85b0: 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
85c0: 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
85d0: 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
85e0: 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
85f0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
8600: 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
8610: 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
8620: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
8630: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
8640: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
8650: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
8660: 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
8670: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
8680: 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
8690: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
86a0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
86b0: 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
86c0: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
86d0: 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
86e0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
86f0: 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
8700: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8710: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8720: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
8730: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
8740: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
8750: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
8760: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
8770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8780: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8790: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
87a0: 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
87b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
87c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
87d0: 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
87e0: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
87f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8800: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
8810: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
8820: 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20  g = 0;..#if 0.  
8830: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73  /* This error is
8840: 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74   now caught by t
8850: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20  he caller..  ** 
8860: 53 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73  Search for "xBes
8870: 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
8880: 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66  on" below */.  f
8890: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
88a0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
88b0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
88c0: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
88d0: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
88e0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
88f0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
8900: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8910: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8920: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
8930: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8940: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8950: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8960: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
8970: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  dif..  return pP
8980: 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
8990: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
89a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
89b0: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
89c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
89d0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
89e0: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
89f0: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
8a00: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
8a10: 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
8a20: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
8a30: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
8a40: 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
8a50: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
8a60: 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
8a70: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8a80: 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
8a90: 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Rec.**    aStat[
8aa0: 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
8ab0: 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
8ac0: 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20  l to pRec.**.** 
8ad0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
8ae0: 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
8af0: 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
8b00: 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
8b10: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
8b20: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
8b30: 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  Rec. Note that t
8b40: 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  his index is not
8b50: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74   an index.** int
8b60: 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  o the aSample[] 
8b70: 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e  array - it is an
8b80: 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69   index into a vi
8b90: 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d  rtual set of sam
8ba0: 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ples.** based on
8bb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8bc0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74   aSample[] and t
8bd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
8be0: 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a  lds in record .*
8bf0: 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74  * pRec. .*/.stat
8c00: 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
8c10: 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
8c20: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8c30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8c40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8c50: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8c70: 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
8c80: 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
8c90: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
8ca0: 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56  pRec,       /* V
8cb0: 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20  ector of values 
8cc0: 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
8cd0: 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cf0: 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65  Round up if true
8d00: 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66  .  Round down if
8d10: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77   false */.  tRow
8d20: 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20  cnt *aStat      
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8d40: 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65  stats written he
8d50: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
8d60: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
8d70: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
8d80: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8da0: 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69  * Index of requi
8db0: 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45  red stats in anE
8dc0: 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  q[] etc. */.  in
8dd0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8df0: 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70  ex of first samp
8e00: 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20  le >= pRec */.  
8e10: 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20  int iSample;    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e30: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
8e40: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
8e50: 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
8e60: 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e80: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8e90: 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
8ea0: 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
8ed0: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
8ee0: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
8ef0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
8f00: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
8f10: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
8f20: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
8f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f40: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
8f50: 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77  n pRec */.  tRow
8f60: 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20  cnt iLower = 0; 
8f70: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b          /* anLt[
8f80: 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61  ] + anEq[] of la
8f90: 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65  rgest sample pRe
8fa0: 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64  c is > */..#ifnd
8fb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8fc0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8fd0: 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
8fe0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
8ff0: 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Rec!=0 );.  asse
9000: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
9010: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
9020: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
9030: 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c  && pRec->nField<
9040: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  =pIdx->nSampleCo
9050: 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20  l );..  /* Do a 
9060: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
9070: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
9080: 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74  sample greater t
9090: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a  han or equal.  *
90a0: 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52  * to pRec. If pR
90b0: 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ec contains a si
90c0: 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20  ngle field, the 
90d0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  set of samples t
90e0: 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73  o search.  ** is
90f0: 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d   simply the aSam
9100: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ple[] array. If 
9110: 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61  the samples in a
9120: 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e  Sample[] contain
9130: 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20   more.  ** than 
9140: 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20  one fields, all 
9150: 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  fields following
9160: 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69   the first are i
9170: 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  gnored..  **.  *
9180: 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  * If pRec contai
9190: 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65  ns N fields, whe
91a0: 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61  re N is more tha
91b0: 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77  n one, then as w
91c0: 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ell as the.  ** 
91d0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
91e0: 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20  le[] (truncated 
91f0: 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68  to N fields), th
9200: 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61  e search also ha
9210: 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  s to.  ** consid
9220: 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74  er prefixes of t
9230: 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f  hose samples. Fo
9240: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
9250: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9260: 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65  .  ** in aSample
9270: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
9280: 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20     aSample[0] = 
9290: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
92a0: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61   aSample[1] = (a
92b0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
92c0: 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c  aSample[2] = (b,
92d0: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
92e0: 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31  ample[3] = (c, 1
92f0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  00) .  **     aS
9300: 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31  ample[4] = (c, 1
9310: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  05).  **.  ** Th
9320: 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70  en the search sp
9330: 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c  ace should ideal
9340: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65  ly be the sample
9350: 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20  s above and the 
9360: 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65  .  ** unique pre
9370: 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61  fixes [a], [b] a
9380: 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63  nd [c]. But sinc
9390: 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74  e that is hard t
93a0: 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a  o organize, .  *
93b0: 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61  * the code actua
93c0: 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69  lly searches thi
93d0: 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s set:.  **.  **
93e0: 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a       0: (a) .  *
93f0: 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20  *     1: (a, 5) 
9400: 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c  .  **     2: (a,
9410: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33   10) .  **     3
9420: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
9430: 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a      4: (b) .  **
9440: 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a       5: (b, 5) .
9450: 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20    **     6: (c) 
9460: 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c  .  **     7: (c,
9470: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9480: 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  8: (c, 105).  **
9490: 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29       9: (c, 105)
94a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
94b0: 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ach sample in th
94c0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
94d0: 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65  y, N samples are
94e0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
94f0: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73    ** effective s
9500: 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20  ample array. In 
9510: 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c  the above, sampl
9520: 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62  es 0 and 1 are b
9530: 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61  ased on .  ** sa
9540: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  mple aSample[0].
9550: 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   Samples 2 and 3
9560: 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65   on aSample[1] e
9570: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  tc..  **.  ** Of
9580: 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66  ten, sample i of
9590: 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e   each block of N
95a0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
95b0: 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65  es has (i+1) fie
95c0: 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74  lds..  ** Except
95d0: 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61  , each sample ma
95e0: 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  y be extended to
95f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20   ensure that it 
9600: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
9610: 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  or.  ** equal to
9620: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61   the previous sa
9630: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61  mple in the arra
9640: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
9650: 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20  in the above, . 
9660: 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20   ** sample 2 is 
9670: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
9680: 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e   of a block of N
9690: 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20   samples, so at 
96a0: 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61  first it .  ** a
96b0: 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73  ppears that it s
96c0: 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64  hould be 1 field
96d0: 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65   in size. Howeve
96e0: 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  r, that would ma
96f0: 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c  ke it .  ** smal
9700: 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
9710: 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79  1, so the binary
9720: 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f   search would no
9730: 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73  t work. As a res
9740: 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  ult, .  ** it is
9750: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f   extended to two
9760: 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70   fields. The dup
9770: 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69  licates that thi
9780: 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74  s creates do not
9790: 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79   .  ** cause any
97a0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
97b0: 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d    nField = pRec-
97c0: 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20  >nField;.  iCol 
97d0: 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d  = 0;.  iSample =
97e0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a   pIdx->nSample *
97f0: 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20   nField;.  do{. 
9800: 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20     int iSamp;   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61   /* Index in aSa
9830: 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73  mple[] of test s
9840: 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ample */.    int
9850: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
9860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9870: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
9880: 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  n test sample */
9890: 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  ..    iTest = (i
98a0: 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a  Min+iSample)/2;.
98b0: 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73      iSamp = iTes
98c0: 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  t / nField;.    
98d0: 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20  if( iSamp>0 ){. 
98e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70       /* The prop
98f0: 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73  osed effective s
9900: 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69  ample is a prefi
9910: 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d  x of sample aSam
9920: 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20  ple[iSamp]..    
9930: 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c    ** Specificall
9940: 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20  y, the shortest 
9950: 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61  prefix of at lea
9960: 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46  st (1 + iTest%nF
9970: 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20  ield) .      ** 
9980: 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67  fields that is g
9990: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
99a0: 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69  previous effecti
99b0: 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20  ve sample.  */. 
99c0: 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73       for(n=(iTes
99d0: 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b  t % nField) + 1;
99e0: 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b   n<nField; n++){
99f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
9a00: 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e  mple[iSamp-1].an
9a10: 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65  Lt[n-1]!=aSample
9a20: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
9a30: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
9a40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9a50: 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20      n = iTest + 
9a60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52  1;.    }..    pR
9a70: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a  ec->nField = n;.
9a80: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
9a90: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
9aa0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  re(aSample[iSamp
9ab0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61  ].n, aSample[iSa
9ac0: 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  mp].p, pRec);.  
9ad0: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
9ae0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9af0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9b00: 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65  t[n-1] + aSample
9b10: 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31  [iSamp].anEq[n-1
9b20: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
9b30: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
9b40: 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  se if( res==0 &&
9b50: 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20   n<nField ){.   
9b60: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9b70: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9b80: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9b90: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9ba0: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
9bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61  }else{.      iSa
9bc0: 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20  mple = iTest;.  
9bd0: 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a      iCol = n-1;.
9be0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9bf0: 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d  res && iMin<iSam
9c00: 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61  ple );.  i = iSa
9c10: 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a  mple / nField;..
9c20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9c30: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
9c40: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
9c50: 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
9c60: 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
9c70: 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
9c80: 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
9c90: 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
9ca0: 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
9cb0: 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
9cc0: 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
9cd0: 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
9ce0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
9cf0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9d00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iled==0 ){.    i
9d10: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
9d20: 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
9d30: 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
9d40: 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75  pRec must be equ
9d50: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20  al to sample i. 
9d60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9d70: 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
9d80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9d90: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
9da0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9db0: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9dc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
9dd0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
9de0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9df0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
9e00: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20  [i].p, pRec) .  
9e10: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9e20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9e30: 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20  iled .      );. 
9e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e50: 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64  /* Unless i==pId
9e60: 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69  x->nSample, indi
9e70: 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63  cating that pRec
9e80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
9e90: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d        ** all sam
9ea0: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d  ples in the aSam
9eb0: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65  ple[] array, pRe
9ec0: 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
9ed0: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
9ee0: 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65   ** (iCol+1) fie
9ef0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
9f00: 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20  ple i.  */.     
9f10: 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78   assert( i<=pIdx
9f20: 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d  ->nSample && i>=
9f30: 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  0 );.      pRec-
9f40: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31  >nField = iCol+1
9f50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f60: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9f70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9f80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f90: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9fa0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9fb0: 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
9fc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9fd0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9fe0: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
9ff0: 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f   if i==0 and iCo
a000: 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72  l==0, then recor
a010: 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65  d pRec is smalle
a020: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
a030: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  es.      ** in t
a040: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
a050: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
a060: 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20  f (iCol>0) then 
a070: 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20  pRec must.      
a080: 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ** be greater th
a090: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
a0a0: 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20  he (iCol) field 
a0b0: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
a0c0: 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   i..      ** If 
a0d0: 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63  (i>0), then pRec
a0e0: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72   must also be gr
a0f0: 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  eater than sampl
a100: 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20  e (i-1).  */.   
a110: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
a120: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a130: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20  Field = iCol;.  
a140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a150: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a160: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a170: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a180: 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20  p, pRec)<=0.    
a190: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
a1a0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
a1b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
a1c0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
a1d0: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a1e0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a1f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a200: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a210: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a220: 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
a230: 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
a240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a250: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
a280: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
a290: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
a2a0: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
a2b0: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52      /* Record pR
a2c0: 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73  ec is equal to s
a2d0: 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61  ample i */.    a
a2e0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
a2f0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74  eld-1 );.    aSt
a300: 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
a310: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
a320: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
a330: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
a340: 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
a350: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
a360: 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29  nt, the (iCol+1)
a370: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
a380: 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
a390: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
a3a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
a3b0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65  greater than pRe
a3c0: 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64  c. Or, if i==pId
a3d0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20  x->nSample then 
a3e0: 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c  pRec.    ** is l
a3f0: 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  arger than all s
a400: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72  amples in the ar
a410: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ray. */.    tRow
a420: 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70  cnt iUpper, iGap
a430: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  ;.    if( i>=pId
a440: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->nSample ){.  
a450: 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
a460: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
a470: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
a480: 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[0]);.    }else
a490: 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
a4a0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
a4b0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCol];.    }.. 
a4c0: 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
a4d0: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
a4e0: 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
a4f0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
a500: 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
a510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a520: 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
a530: 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
a540: 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
a550: 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
a560: 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
a570: 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
a580: 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61  + iGap;.    aSta
a590: 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76  t[1] = pIdx->aAv
a5a0: 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a  gEq[iCol];.  }..
a5b0: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
a5c0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
a5d0: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
a5e0: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
a5f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
a600: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
a610: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a620: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
a630: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
a640: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
a650: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
a660: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
a670: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
a680: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
a690: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
a6a0: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
a6b0: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
a6c0: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
a6d0: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
a6e0: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
a6f0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a700: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
a710: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
a720: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
a730: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
a740: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
a750: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
a760: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
a770: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
a780: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
a790: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
a7a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
a7b0: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
a7c0: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
a7d0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
a7e0: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
a7f0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
a800: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
a810: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
a820: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
a830: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
a840: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
a850: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
a860: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
a870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
a880: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
a890: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
a8a0: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
a8b0: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
a8c0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
a8d0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
a8e0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
a8f0: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
a900: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
a910: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
a920: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
a930: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
a940: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
a950: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
a960: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
a970: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
a980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
a990: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
a9a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a9b0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a9c0: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
a9d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
a9e0: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
a9f0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
aa00: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
aa10: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
aa20: 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33  Affinity(sqlite3
aa30: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
aa40: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
aa50: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
aa60: 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43  && iCol<pIdx->nC
aa70: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21  olumn );.  if( !
aa80: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  pIdx->zColAff ){
aa90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
aaa0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
aab0: 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20  (db, pIdx)==0 ) 
aac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
aad0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
aae0: 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41  turn pIdx->zColA
aaf0: 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64  ff[iCol];.}.#end
ab00: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
ab10: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ab20: 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20  OR_STAT4./* .** 
ab30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ab40: 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d   called to estim
ab50: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
ab60: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
ab70: 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61  y a.** range-sca
ab80: 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e  n on a skip-scan
ab90: 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
aba0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ple:.**.**   CRE
abb0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
abc0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20  t1(a, b, c);.** 
abd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
abe0: 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  t1 WHERE a=? AND
abf0: 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   c BETWEEN ? AND
ac00: 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20   ?;.**.** Value 
ac10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63  pLoop->nOut is c
ac20: 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
ac30: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
ac40: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a  mber of rows .**
ac50: 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61   visited for sca
ac60: 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62  nning (a=? AND b
ac70: 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  =?). This functi
ac80: 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20  on reduces that 
ac90: 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20  estimate .** by 
aca0: 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61  some factor to a
acb0: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28  ccount for the (
acc0: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
acd0: 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61  ?) expression ba
ace0: 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  sed.** on the st
acf0: 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65  at4 data for the
ad00: 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61   index. this sca
ad10: 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d  n will be peform
ad20: 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
ad30: 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20  times (once for 
ad40: 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69  each (a,b) combi
ad50: 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63  nation that matc
ad60: 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c  hes a=?) is deal
ad70: 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68  t with .** by th
ad80: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
ad90: 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20  It does this by 
ada0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
adb0: 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c   all stat4 sampl
adc0: 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61  es, comparing va
add0: 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65  lues.** extracte
ade0: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
adf0: 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68  d pUpper with th
ae00: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
ae10: 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a  column in each.*
ae20: 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61  * sample. If L a
ae30: 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d  nd U are the num
ae40: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66  ber of samples f
ae50: 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20  ound to be less 
ae60: 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c  than or.** equal
ae70: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65   to the values e
ae80: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
ae90: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
aea0: 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e  respectively, an
aeb0: 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f  d.** N is the to
aec0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
aed0: 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70  mples, the pLoop
aee0: 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20  ->nOut value is 
aef0: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66  adjusted.** as f
af00: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
af10: 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20  nOut = nOut * ( 
af20: 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20  min(U - L, 1) / 
af30: 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f  N ).**.** If pLo
af40: 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  wer is NULL, or 
af50: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
af60: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
af70: 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a   the term, L is.
af80: 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ** set to zero. 
af90: 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c  If pUpper is NUL
afa0: 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
afb0: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
afc0: 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20  d from it,.** U 
afd0: 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a  is set to N..**.
afe0: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  ** Normally, thi
aff0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
b000: 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66  *pbDone to 1 bef
b010: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48  ore returning. H
b020: 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f  owever,.** if no
b030: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78   value can be ex
b040: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74  tracted from eit
b050: 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55  her pLower or pU
b060: 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65  pper (and so the
b070: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20  .** estimate of 
b080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b090: 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d  ws delivered rem
b0a0: 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c  ains unchanged),
b0b0: 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c   *pbDone.** is l
b0c0: 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a  eft as is..**.**
b0d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
b0e0: 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
b0f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
b100: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
b110: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  , .** SQLITE_OK.
b120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b130: 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
b140: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
b150: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
b160: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
b170: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
b180: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
b190: 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
b1a0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
b1b0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
b1c0: 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
b1d0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
b1e0: 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
b1f0: 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
b200: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b210: 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
b220: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
b230: 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a  op *pLoop,    /*
b240: 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75   Update the .nOu
b250: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  t value of this 
b260: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  loop */.  int *p
b270: 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f  bDone          /
b280: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
b290: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78   at least one ex
b2a0: 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63  pr. value extrac
b2b0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ted */.){.  Inde
b2c0: 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
b2d0: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
b2e0: 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
b2f0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
b300: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b310: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b320: 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69  nLower = -1;.  i
b330: 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e  nt nUpper = p->n
b340: 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20  Sample+1;.  int 
b350: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b360: 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74    u8 aff = sqlit
b370: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
b380: 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71  inity(db, p, nEq
b390: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
b3a0: 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  oll;.  .  sqlite
b3b0: 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b  3_value *p1 = 0;
b3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
b3d0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
b3e0: 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71  m pLower */.  sq
b3f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20  lite3_value *p2 
b400: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
b410: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
b420: 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a   from pUpper */.
b430: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
b440: 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pVal = 0;      
b450: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
b460: 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64  cted from record
b470: 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73   */..  pColl = s
b480: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b490: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61  Seq(pParse, p->a
b4a0: 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69  zColl[nEq]);.  i
b4b0: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
b4c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
b4d0: 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
b4e0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e  pParse, pLower->
b4f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
b500: 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c  ff, &p1);.    nL
b510: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ower = 0;.  }.  
b520: 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63  if( pUpper && rc
b530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b550: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b560: 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72  r(pParse, pUpper
b570: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b580: 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20   aff, &p2);.    
b590: 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20  nUpper = p2 ? 0 
b5a0: 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20  : p->nSample;.  
b5b0: 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70  }..  if( p1 || p
b5c0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
b5d0: 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20      int nDiff;. 
b5e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
b5f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
b600: 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
b610: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b620: 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64  te3Stat4Column(d
b630: 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  b, p->aSample[i]
b640: 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  .p, p->aSample[i
b650: 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29  ].n, nEq, &pVal)
b660: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
b670: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20  SQLITE_OK && p1 
b680: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b690: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b6a0: 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c  ompare(p1, pVal,
b6b0: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b6c0: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c   if( res>=0 ) nL
b6d0: 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ower++;.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b6f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b  LITE_OK && p2 ){
b700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
b710: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
b720: 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70  pare(p2, pVal, p
b730: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
b740: 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70  f( res>=0 ) nUpp
b750: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b760: 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20    }.    nDiff = 
b770: 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72  (nUpper - nLower
b780: 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66  );.    if( nDiff
b790: 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b  <=0 ) nDiff = 1;
b7a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
b7b0: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
b7c0: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  er and lower bou
b7d0: 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e  nd specified, an
b7e0: 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  d the .    ** co
b7f0: 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61  mparisons indica
b800: 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65  te that they are
b810: 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c   close together,
b820: 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63   use the fallbac
b830: 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20  k.    ** method 
b840: 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65  (assume that the
b850: 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36   scan visits 1/6
b860: 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66  4 of the rows) f
b870: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20  or estimating.  
b880: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
b890: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e  of rows visited.
b8a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69   Otherwise, esti
b8b0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
b8c0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75  of rows.    ** u
b8d0: 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20  sing the method 
b8e0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b8f0: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
b900: 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
b910: 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44  n. */.    if( nD
b920: 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72  iff!=1 || pUpper
b930: 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30  ==0 || pLower==0
b940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
b950: 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33  djust = (sqlite3
b960: 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c  LogEst(p->nSampl
b970: 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45  e) - sqlite3LogE
b980: 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20  st(nDiff));.    
b990: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d    pLoop->nOut -=
b9a0: 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20   nAdjust;.      
b9b0: 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  *pbDone = 1;.   
b9c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
b9d0: 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70  10, ("range skip
b9e0: 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25  -scan regions: %
b9f0: 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64  u..%u  adjust=%d
ba00: 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e         nLower, n
ba30: 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d  Upper, nAdjust*-
ba40: 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29  1, pLoop->nOut))
ba50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
ba60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  {.    assert( *p
ba70: 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a  bDone==0 );.  }.
ba80: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
ba90: 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74  ree(p1);.  sqlit
baa0: 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b  e3ValueFree(p2);
bab0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
bac0: 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
bad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
bae0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
baf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bb00: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  4 */../*.** This
bb10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
bb20: 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
bb30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
bb40: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
bb50: 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
bb60: 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
bb70: 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
bb80: 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
bb90: 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
bba0: 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
bbb0: 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
bbc0: 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
bbd0: 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
bbe0: 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
bbf0: 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
bc00: 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
bc10: 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
bc20: 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
bc30: 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
bc40: 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
bc50: 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
bc60: 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
bc70: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
bc80: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
bc90: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
bca0: 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
bcb0: 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
bce0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
bcf0: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
bd00: 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
bd10: 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
bd20: 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
bd30: 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
bd40: 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
bd50: 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
bd60: 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
bd70: 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
bd80: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
bd90: 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64  value in (pBuild
bda0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
bdb0: 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75  e.nEq) is the nu
bdc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
bdd0: 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  x.** column subj
bde0: 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65  ect to the range
bdf0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
be00: 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
be10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
be20: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
be30: 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62  ints optimized b
be40: 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
be50: 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
be60: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d  xample,.** assum
be70: 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f  ing index p is o
be80: 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
be90: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
bea0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
beb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
bec0: 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
bed0: 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
bee0: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
bef0: 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  to 1 (as the ran
bf00: 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
bf10: 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20  lumn, b, is the 
bf20: 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d  second .** left-
bf30: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
bf40: 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
bf50: 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
bf60: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
bf70: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
bf80: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
bf90: 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
bfa0: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
bfb0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
bfc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
bfd0: 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
bfe0: 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  he sqlite3LogEst
bff0: 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  () of the.** num
c000: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
c010: 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
c020: 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
c030: 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a  isit without .**
c040: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
c050: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
c060: 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c  ts. If nEq is 0,
c070: 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20   then *pnOut is 
c080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
c090: 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
c0a0: 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
c0b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
c0c0: 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
c0d0: 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
c0e0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
c0f0: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
c100: 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  nts pLower and p
c110: 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e  Upper..** .** In
c120: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
c130: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41  sqlite_stat4 ANA
c140: 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66  LYZE data, or if
c150: 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f   such data canno
c160: 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20  t be.** used, a 
c170: 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65  single range ine
c180: 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
c190: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
c1a0: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c1b0: 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69  4. .** and a pai
c1c0: 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
c1d0: 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
c1e0: 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
c1f0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
c200: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
c210: 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e   a factor of 64.
c220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c230: 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
c240: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c250: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
c260: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
c270: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
c280: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
c290: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
c2a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
c2b0: 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
c2c0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c2d0: 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
c2e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c2f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
c300: 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
c310: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
c320: 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
c330: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c340: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
c350: 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66  oop     /* Modif
c360: 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20  y the .nOut and 
c370: 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c  maybe .rRun fiel
c380: 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ds */.){.  int r
c390: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c3a0: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f   int nOut = pLoo
c3b0: 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73  p->nOut;.  LogEs
c3c0: 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  t nNew;..#ifdef 
c3d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c3e0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49  AT3_OR_STAT4.  I
c3f0: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
c400: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
c410: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
c420: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
c430: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
c440: 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  le>0 && nEq<p->n
c450: 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20  SampleCol ){.   
c460: 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
c470: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b  er->nRecValid ){
c480: 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52  .      UnpackedR
c490: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
c4a0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
c4b0: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
c4c0: 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a  ;.      u8 aff;.
c4d0: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
c4e0: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
c4f0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c510: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
c520: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
c530: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
c540: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c550: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
c560: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
c570: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
c580: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
c590: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
c5a0: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
c5b0: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
c5c0: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
c5d0: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
c5e0: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
c5f0: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
c600: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
c610: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c620: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
c630: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
c640: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
c650: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
c660: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
c670: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
c680: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
c690: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
c6a0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
c6b0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
c6c0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
c6d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
c6e0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c6f0: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
c700: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
c710: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
c720: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
c730: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
c740: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
c750: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c760: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
c770: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
c780: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
c790: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
c7a0: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
c7b0: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
c7c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c7d0: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
c7e0: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
c7f0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
c800: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c810: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
c820: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
c830: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
c840: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
c850: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
c860: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
c870: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
c880: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
c890: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
c8a0: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
c8b0: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
c8c0: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
c8d0: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
c8e0: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
c8f0: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
c900: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c910: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
c920: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
c930: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
c940: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
c950: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
c960: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c970: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
c980: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c990: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
c9a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
c9b0: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
c9c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
c9d0: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
c9e0: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
c9f0: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
ca00: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
ca10: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ca20: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
ca30: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
ca40: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
ca50: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
ca60: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
ca70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ca80: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
ca90: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
caa0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
cab0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
cac0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
cad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
cae0: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
caf0: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
cb00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e  pParse->db, p, n
cb10: 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
cb20: 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79 43  t( nEq!=p->nKeyC
cb30: 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ol || aff==SQLIT
cb40: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
cb50: 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
cb60: 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
cb70: 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
cb80: 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
cb90: 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
cba0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
cbb0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
cbc0: 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
cbd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cbe0: 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
cbf0: 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
cc00: 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
cc10: 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
cc20: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
cc30: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
cc40: 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
cc50: 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
cc60: 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
cc70: 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
cc80: 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
cc90: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
cca0: 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
ccb0: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
ccc0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
ccd0: 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
cce0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ccf0: 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
cd00: 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
cd10: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
cd20: 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
cd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
cd40: 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
cd50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
cd60: 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
cd70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cd80: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
cd90: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
cda0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
cdb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
cdc0: 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
cdd0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
cde0: 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
cdf0: 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
ce00: 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
ce10: 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
ce20: 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
ce30: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
ce40: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
ce50: 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
ce60: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
ce70: 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
ce80: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
ce90: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
cec0: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
ced0: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
cee0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
cef0: 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
cf00: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
cf10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
cf20: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
cf30: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
cf40: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
cf50: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
cf60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cf70: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
cf80: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
cf90: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cfa0: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
cfb0: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
cfc0: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
cfe0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
cff0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
d000: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
d010: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d020: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d030: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d040: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d050: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d060: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d080: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d090: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d0a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d0b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d0c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d0d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d0e0: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
d110: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
d120: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
d130: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
d140: 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
d150: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
d160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
d170: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
d180: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
d190: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
d1a0: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
d1b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d1c0: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
d1d0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
d1e0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d1f0: 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
d200: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d210: 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
d220: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
d230: 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
d240: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d250: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
d260: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
d270: 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
d280: 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
d290: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
d2a0: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
d2b0: 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
d2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
d2d0: 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
d2e0: 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
d2f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d310: 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
d320: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
d330: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
d340: 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
d350: 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
d360: 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
d370: 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
d380: 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
d390: 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
d3a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
d3b0: 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
d3c0: 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
d3d0: 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
d3e0: 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
d3f0: 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
d400: 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
d410: 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
d420: 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
d430: 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
d440: 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
d450: 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
d460: 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
d470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d480: 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
d490: 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
d4a0: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
d4b0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
d4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
d4e0: 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
d4f0: 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
d500: 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
d510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d520: 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
d530: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
d540: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
d550: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
d560: 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
d570: 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
d580: 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
d590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
d5b0: 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
d5c0: 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
d5d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d5e0: 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
d5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
d600: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
d610: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
d620: 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
d630: 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
d640: 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
d650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d660: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
d670: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d680: 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
d690: 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
d6a0: 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
d6b0: 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
d6c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
d6d0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d6e0: 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
d6f0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
d700: 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
d710: 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
d720: 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
d730: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d740: 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
d750: 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
d760: 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
d770: 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
d780: 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
d790: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
d7a0: 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
d7b0: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
d7c0: 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
d7d0: 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
d7e0: 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
d7f0: 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
d800: 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
d810: 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
d820: 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
d830: 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
d840: 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
d850: 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
d860: 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
d870: 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
d880: 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
d890: 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
d8a0: 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
d8b0: 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
d8c0: 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
d8d0: 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
d8e0: 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
d8f0: 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
d900: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
d910: 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
d920: 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
d930: 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
d940: 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
d950: 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
d960: 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
d970: 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
d980: 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
d990: 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
d9a0: 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
d9b0: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
d9c0: 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
d9d0: 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
d9e0: 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
d9f0: 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
da00: 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
da10: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
da20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da30: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
da40: 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
da50: 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
da60: 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
da70: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
da80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
da90: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
daa0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
dab0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
dac0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
dad0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
dae0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
daf0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
db00: 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
db10: 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
db20: 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
db30: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
db40: 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
db50: 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
db60: 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
db70: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
db80: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
db90: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
dba0: 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
dbb0: 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
dbc0: 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
dbd0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
dbe0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
dbf0: 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
dc00: 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
dc10: 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
dc20: 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
dc30: 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
dc40: 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
dc50: 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
dc60: 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
dc70: 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
dc80: 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
dc90: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
dca0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
dcb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
dcc0: 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
dcd0: 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
dce0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
dcf0: 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
dd00: 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
dd10: 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
dd20: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
dd30: 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
dd40: 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
dd50: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
dd60: 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
dd70: 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
dd80: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
dd90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
dda0: 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
ddb0: 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
ddc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ddd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
dde0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ddf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
de00: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
de10: 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
de20: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
de30: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
de40: 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
de50: 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
de60: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
de70: 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
de80: 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
de90: 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
dea0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
deb0: 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
dec0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
ded0: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
dee0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
def0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
df00: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
df10: 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
df20: 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
df50: 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
df60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df70: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
df80: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
df90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
dfa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dfb0: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
dfc0: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
dfd0: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
dfe0: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
dff0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e000: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e010: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e020: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e030: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e040: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e050: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e060: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e070: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e080: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e090: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e0a0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e0b0: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e0c0: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e0d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e0e0: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e0f0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e100: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e120: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e130: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e140: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e150: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e160: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e170: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e180: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e190: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e1a0: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
e1b0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
e1c0: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
e1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e1e0: 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 73  ;.  }..  aff = s
e1f0: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
e200: 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  nAffinity(pParse
e210: 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29 3b  ->db, p, nEq-1);
e220: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
e230: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e240: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
e250: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
e260: 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
e270: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
e280: 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
e290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e2a0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
e2b0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
e2c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e2d0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e2e0: 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
e2f0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e300: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
e310: 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
e320: 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
e330: 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25  y scan regions %
e340: 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20  s(%d): %d\n",.  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31   p->zName, nEq-1
e370: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
e380: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
e390: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
e3a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e3b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e3c0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
e3d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e3e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e3f0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e400: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
e410: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
e420: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
e430: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
e440: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
e450: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e460: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e470: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
e480: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
e490: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
e4a0: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
e4b0: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
e4c0: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
e4d0: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
e4e0: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
e500: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
e510: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
e520: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
e530: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
e540: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
e550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e560: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
e570: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
e580: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
e590: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
e5a0: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
e5b0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
e5c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
e5d0: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
e5e0: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
e5f0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
e600: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
e610: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
e620: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
e630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
e640: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
e650: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
e660: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e670: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e680: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e690: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e6a0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e6b0: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
e6c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
e6d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
e6e0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
e6f0: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
e700: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
e710: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e720: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e730: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e740: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e750: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e760: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e770: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
e780: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
e790: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
e7a0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
e7b0: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
e7c0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e7d0: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
e7f0: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
e800: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
e810: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
e820: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e830: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
e840: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
e850: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
e860: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
e870: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
e880: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
e890: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e8b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e8c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e8d0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
e8e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e8f0: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
e900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e910: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
e920: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
e930: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
e940: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
e950: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
e960: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
e970: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
e980: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e990: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
e9a0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
e9b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e9c0: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
e9d0: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
e9e0: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
e9f0: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
ea00: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
ea10: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
ea20: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ea30: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ea40: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ea50: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
ea60: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ea70: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ea80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ea90: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
eaa0: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
eab0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
eac0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ead0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
eae0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
eaf0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
eb00: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
eb10: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
eb20: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
eb30: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
eb40: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
eb50: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
eb60: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
eb70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
eb80: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68  zType[4];.    ch
eb90: 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20  ar zLeft[50];.  
eba0: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
ebb0: 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
ebc0: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
ebd0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
ebe0: 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
ebf0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
ec00: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ec10: 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
ec20: 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
ec30: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ec40: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
ec50: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
ec60: 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
ec70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ec80: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
ec90: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GLE ){.      sql
eca0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
ecb0: 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66  zeof(zLeft),zLef
ecc0: 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22  t,"left={%d:%d}"
ecd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ece0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
ecf0: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
ed00: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29  m->u.leftColumn)
ed10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ed20: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
ed30: 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26  r & WO_OR)!=0 &&
ed40: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
ed50: 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o!=0 ){.      sq
ed60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
ed70: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ed80: 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78  ft,"indexable=0x
ed90: 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20  %lld", .        
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
edb0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
edc0: 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20  >indexable);.   
edd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ede0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
edf0: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ee00: 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54  ft,"left=%d", pT
ee10: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
ee20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ee30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
ee40: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
ee50: 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70 72  d %p %s %-12s pr
ee60: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
ee70: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
ee80: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
ee90: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
eea0: 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74   zLeft, pTerm->t
eeb0: 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20  ruthProb,.      
eec0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
eed0: 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  r, pTerm->wtFlag
eee0: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
eef0: 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70  reeViewExpr(0, p
ef00: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Term->pExpr, 0);
ef10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
ef20: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
ef30: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
ef40: 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  how the complete
ef50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68   content of a Wh
ef60: 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69  ereClause.*/.voi
ef70: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c  d sqlite3WhereCl
ef80: 61 75 73 65 50 72 69 6e 74 28 57 68 65 72 65 43  ausePrint(WhereC
ef90: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
efa0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
efb0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
efc0: 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54 65  ++){.    whereTe
efd0: 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b  rmPrint(&pWC->a[
efe0: 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65  i], i);.  }.}.#e
eff0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45  ndif..#ifdef WHE
f000: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f010: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
f020: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
f030: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
f040: 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
f050: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
f060: 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
f070: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
f080: 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  WC){.  WhereInfo
f090: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
f0a0: 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62  pWInfo;.  int nb
f0b0: 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54   = 1+(pWInfo->pT
f0c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f  abList->nSrc+3)/
f0d0: 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  4;.  struct SrcL
f0e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
f0f0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
f100: 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
f110: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
f120: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
f130: 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28  Bitmask mAll = (
f140: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e  ((Bitmask)1)<<(n
f150: 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c  b*4)) - 1;.  sql
f160: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f170: 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
f180: 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
f1b0: 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
f1c0: 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d 41  , p->prereq & mA
f1d0: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ll);.  sqlite3De
f1e0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
f1f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f200: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
f210: 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
f220: 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
f230: 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
f240: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f250: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
f260: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
f270: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
f280: 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
f290: 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
f2a0: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
f2b0: 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
f2c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
f2d0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
f2e0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
f2f0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
f300: 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
f310: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
f320: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
f330: 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
f340: 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
f350: 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
f360: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f370: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
f380: 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
f390: 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
f3a0: 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
f3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f3c0: 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
f3d0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
f3e0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
f3f0: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
f400: 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
f410: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f420: 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
f430: 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
f440: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
f450: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
f460: 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
f470: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f490: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f4a0: 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
f4b0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f4c0: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
f4d0: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
f4e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f4f0: 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
f500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f510: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
f520: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
f530: 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
f540: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
f550: 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
f560: 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
f570: 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
f580: 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
f590: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
f5a0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
f5b0: 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
f5c0: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
f5d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
f5e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
f5f0: 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
f600: 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
f610: 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
f620: 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
f630: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
f640: 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
f650: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f670: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
f680: 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
f690: 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
f6a0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
f6b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
f6c0: 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
f6d0: 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
f6e0: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
f6f0: 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
f700: 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
f710: 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
f720: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f730: 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
f740: 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
f750: 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
f760: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
f770: 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
f780: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
f790: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
f7a0: 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
f7b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
f7c0: 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
f7d0: 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
f7e0: 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
f7f0: 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
f800: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
f810: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
f820: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f830: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f840: 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
f850: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
f860: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f870: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
f880: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f890: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
f8a0: 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
f8b0: 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
f8c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f8d0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
f8e0: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f8f0: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
f900: 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
f910: 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
f920: 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
f930: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
f940: 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
f950: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
f960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f980: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f990: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
f9a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f9b0: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
f9c0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
f9d0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f9e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
f9f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
fa00: 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
fa10: 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
fa20: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
fa30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fa40: 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
fa50: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
fa60: 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
fa70: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fa80: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fa90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
faa0: 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
fab0: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
fac0: 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
fad0: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
fae0: 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
faf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
fb00: 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
fb10: 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
fb20: 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
fb30: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
fb40: 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
fb50: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
fb60: 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
fb70: 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
fb80: 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
fb90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fba0: 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
fbb0: 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
fbc0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fbd0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  NN(db, sizeof(p-
fbe0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
fbf0: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
fc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fc10: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
fc20: 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
fc30: 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
fc40: 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
fc50: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
fc60: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fc70: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fc80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
fc90: 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
fca0: 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
fcb0: 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
fcc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
fce0: 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
fcf0: 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
fd00: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
fd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fd20: 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
fd30: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
fd40: 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
fd50: 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
fd60: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
fd70: 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
fd80: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
fd90: 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
fda0: 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
fdb0: 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
fdc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
fdd0: 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
fde0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
fdf0: 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  PT;.  }.  memcpy
fe00: 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45  (pTo, pFrom, WHE
fe10: 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29  RE_LOOP_XFER_SZ)
fe20: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
fe30: 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61  aLTerm, pFrom->a
fe40: 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65  LTerm, pTo->nLTe
fe50: 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61  rm*sizeof(pTo->a
fe60: 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66  LTerm[0]));.  if
fe70: 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73  ( pFrom->wsFlags
fe80: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fe90: 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72  TABLE ){.    pFr
fea0: 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  om->u.vtab.needF
feb0: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
fec0: 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46   if( (pFrom->wsF
fed0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
fee0: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
fef0: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65     pFrom->u.btre
ff00: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
ff10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ff20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ff30: 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f  elete a WhereLoo
ff40: 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
ff50: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
ff60: 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  pDelete(sqlite3 
ff70: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
ff80: 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  p){.  whereLoopC
ff90: 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
ffa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ffb0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
ffc0: 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
ffd0: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
ffe0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
fff0: 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
10000 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10010 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
10020 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
10030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10040 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
10050 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
10060 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
10070 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
10080 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
10090 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
100a0 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
100b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
100c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
100d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
100e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
100f0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
10100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10110 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
10120 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
10130 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
10140 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
10150 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
10160 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
10170 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
10180 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
10190 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
101a0 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
101b0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
101c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
101d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
101e0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
101f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10200 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10210 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10220 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
10230 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
10240 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
10250 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
10260 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10270 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20   of Y.**   (3)  
10280 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
10290 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
102a0 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   as Y.**.** By "
102b0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
102c0 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
102d0 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
102e0 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
102f0 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10300 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10310 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10320 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
10330 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
10340 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
10350 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
10360 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
10370 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
10380 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
10390 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
103a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
103b0 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
103c0 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
103d0 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
103e0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
103f0 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69  justed.  The thi
10400 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61  rd rule.** was a
10410 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20  dded because if 
10420 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e  X uses skip-scan
10430 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20   less than Y it 
10440 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64  still might.** d
10450 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63  eserve a lower c
10460 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69  ost even if it i
10470 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10480 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  t of Y..*/.stati
10490 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
104a0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
104b0 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
104c0 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
104d0 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
104e0 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
104f0 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
10500 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
10510 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
10520 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
10530 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
10540 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
10550 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
10560 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
10570 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
10580 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
10590 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
105a0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
105b0 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
105c0 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
105d0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
105e0 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
105f0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
10600 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
10610 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
10620 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
10630 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
10640 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
10650 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
10660 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
10670 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
10680 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
10690 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
106a0 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
106b0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
106c0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
106d0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
106e0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
106f0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
10700 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
10710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10720 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
10730 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
10740 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
10750 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
10760 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
10770 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
10780 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
10790 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
107a0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
107b0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
107c0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
107d0 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
107e0 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
107f0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
10800 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
10810 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
10820 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
10830 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
10840 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
10850 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
10860 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
10870 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10880 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
10890 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
108a0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
108b0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
108c0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
108d0 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
108e0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
108f0 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
10900 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
10910 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
10920 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
10930 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
10940 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10950 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
10960 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
10970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10980 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
10990 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
109a0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
109b0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
109c0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
109d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
109e0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
109f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
10a00 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
10a10 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10a20 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
10a30 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
10a40 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
10a50 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10a60 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
10a70 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
10a80 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
10a90 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
10aa0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
10ab0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
10ac0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
10ad0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
10ae0 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
10af0 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
10b00 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
10b10 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
10b20 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
10b30 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
10b40 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
10b70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10b80 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
10b90 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
10ba0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
10bb0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
10bc0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
10bd0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
10be0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
10bf0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
10c00 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
10c10 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
10c20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
10c30 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
10c40 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
10c50 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
10c60 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
10c70 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
10c80 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
10c90 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10ca0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10cb0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10cc0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10cd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10ce0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10cf0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10d00 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10d10 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
10d20 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
10d30 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
10d40 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10d50 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10d60 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
10d70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
10d80 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
10d90 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
10da0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
10db0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
10dc0 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62  .** supplanted b
10dd0 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
10de0 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
10df0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
10e00 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
10e10 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
10e20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d  supplant.** pTem
10e30 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20  plate, in other 
10e40 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
10e50 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
10e60 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ng on the list..
10e70 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
10e80 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
10e90 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75  pTemplate can su
10ea0 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74  pplant, then ret
10eb0 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20  urn the.** link 
10ec0 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  that points to p
10ed0 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d  X..**.** If pTem
10ee0 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70  plate cannot sup
10ef0 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69  plant any existi
10f00 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
10f10 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
10f20 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
10f30 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65  to the list, the
10f40 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
10f50 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f  er to the tail o
10f60 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
10f70 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
10f80 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
10f90 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
10fa0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
10fb0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10fc0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
10fd0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
10fe0 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
10ff0 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
11000 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
11010 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
11020 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
11030 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
11040 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
11050 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
11060 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
11070 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
11080 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
11090 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
110a0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
110b0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
110c0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
110d0 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
110e0 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
110f0 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
11100 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
11110 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
11120 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
11130 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
11140 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
11150 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
11160 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
11170 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
11180 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
11190 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
111a0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
111b0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
111c0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
111d0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
111e0 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
111f0 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
11200 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11210 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
11220 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11240 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
11250 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11260 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
11270 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
11280 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
11290 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
112a0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
112b0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
112c0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
112d0 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
112e0 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
112f0 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
11300 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
11310 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
11320 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
11330 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
11340 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
11350 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
11360 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
11370 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
11380 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
11390 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
113a0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
113b0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
113c0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
113d0 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
113e0 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
113f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
11400 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
11410 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
11420 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
11430 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
11440 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
11450 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
11460 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
11470 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11480 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11490 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
114a0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
114b0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
114c0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
114d0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
114e0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
114f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11500 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
11510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11520 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
11530 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
11540 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
11550 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
11560 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
11570 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
11580 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
11590 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
115a0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
115b0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
115c0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
115d0 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
115e0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
115f0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11600 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
11610 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
11620 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
11630 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
11640 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
11650 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
11660 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
11670 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
11690 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
116a0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
116b0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
116d0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
116e0 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
116f0 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11710 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
11720 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
11730 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
11740 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
11750 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
11760 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
11770 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
11780 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
11790 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
117a0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
117b0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
117c0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
117d0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
117e0 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
117f0 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
11800 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
11810 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
11820 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
11830 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11840 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
11850 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11860 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
11870 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
11880 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
11890 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
118a0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
118b0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
118e0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
118f0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11920 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
11930 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11940 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
11950 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
11960 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
11970 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
11980 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
11990 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
119a0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
119b0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
119c0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
119d0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
119e0 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
119f0 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
11a00 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
11a10 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
11a20 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11a30 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
11a40 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
11a50 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
11a60 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
11a70 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
11a80 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
11a90 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
11aa0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
11ab0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
11ac0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
11ad0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
11ae0 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
11af0 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
11b00 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
11b10 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
11b20 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
11b30 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
11b40 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
11b50 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
11b60 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
11b70 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
11b80 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
11b90 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
11ba0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
11bb0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
11bc0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
11bd0 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
11be0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
11bf0 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
11c00 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
11c10 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
11c20 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
11c30 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
11c40 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
11c50 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
11c60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
11c70 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
11c80 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
11c90 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11ca0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
11cb0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
11cc0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
11cd0 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
11ce0 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
11cf0 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
11d00 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
11d10 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
11d20 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
11d30 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
11d40 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
11d50 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
11d60 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11d70 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
11d80 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
11d90 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
11da0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
11db0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
11dc0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
11dd0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
11de0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
11df0 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
11e00 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
11e10 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11e20 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
11e30 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
11e40 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
11e50 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
11e60 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
11e70 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
11e80 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
11e90 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
11ea0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
11eb0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
11ec0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
11ed0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
11ee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
11ef0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  t rc;..  /* If p
11f00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11f10 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
11f20 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
11f30 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
11f40 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
11f50 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
11f60 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
11f70 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c  {.    if( pTempl
11f80 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23  ate->nLTerm ){.#
11f90 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11fa0 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20  ABLED.      u16 
11fb0 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  n = pBuilder->pO
11fc0 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69  rSet->n;.      i
11fd0 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
11fe0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
11ff0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
12000 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
12010 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
12020 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
12050 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
12060 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12070 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
12080 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12090 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
120a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
120b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
120c0 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
120d0 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
120e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
120f0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12100 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12110 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
12120 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  f.    }.    retu
12130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12140 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  }..  /* Look for
12150 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
12160 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63  reLoop to replac
12170 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  e with pTemplate
12180 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f  .  */.  whereLoo
12190 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e  pAdjustCost(pWIn
121a0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
121b0 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76  plate);.  ppPrev
121c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
121d0 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e  Lesser(&pWInfo->
121e0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
121f0 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65  e);..  if( ppPre
12200 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  v==0 ){.    /* T
12210 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
12220 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  sts a WhereLoop 
12230 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  on the list that
12240 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
12250 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  * than pTemplate
12260 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65  , so just ignore
12270 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69   pTemplate */.#i
12280 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12290 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
122a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
122b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
122c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
122d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73  ebugPrintf("   s
122e0 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  kip: ");.      w
122f0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12300 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12310 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
12320 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20   SQLITE_OK;  .  
12340 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a  }else{.    p = *
12350 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f  ppPrev;.  }..  /
12360 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
12370 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
12380 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
12390 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
123a0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
123b0 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
123c0 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
123d0 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
123e0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
123f0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
12400 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
12410 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
12420 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
12430 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
12440 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
12450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
12460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12470 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65  3DebugPrintf("re
12480 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20  place: ");.     
12490 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
124a0 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  p, pBuilder->pWC
124b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
124c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
124d0 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
124e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
124f0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12500 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
12510 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
12520 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
12530 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
12540 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
12550 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
12560 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
12570 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
12580 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
12590 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
125a0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
125b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
125c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
125d0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
125e0 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
125f0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
12600 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
12610 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
12620 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
12630 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
12640 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
12650 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
12660 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
12670 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
12680 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
12690 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
126a0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
126b0 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
126c0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
126d0 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
126e0 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
126f0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
12700 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
12710 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
12720 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
12730 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12740 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
12750 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
12760 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
12770 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
12780 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
12790 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
127a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
127b0 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
127c0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
127d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
127e0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
127f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12800 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
12820 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
12830 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
12840 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12850 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
12860 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
12870 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
12880 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
12890 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
128a0 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
128b0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
128c0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
128d0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
128e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
128f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
12900 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
12910 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12920 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12930 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12940 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12950 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12980 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
12990 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
129a0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
129b0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
129c0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
129d0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
129e0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
129f0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
12a00 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
12a10 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
12a20 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12a30 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12a40 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12a50 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12a60 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
12a70 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
12a80 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
12a90 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
12aa0 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
12ab0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
12ac0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
12ad0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
12ae0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
12af0 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
12b00 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
12b10 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
12b20 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
12b30 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12b40 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
12b50 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
12b60 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
12b70 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
12b80 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
12b90 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
12ba0 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
12bb0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
12bc0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
12bd0 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12be0 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
12bf0 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
12c00 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
12c10 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
12c20 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
12c30 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
12c40 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
12c50 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
12c60 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12c70 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
12c80 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
12c90 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
12ca0 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
12cb0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
12cc0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
12cd0 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
12ce0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
12cf0 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
12d00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12d10 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
12d20 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
12d30 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
12d40 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
12d50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12d60 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
12d70 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
12d80 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
12d90 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
12da0 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
12db0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
12dc0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
12dd0 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
12de0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
12df0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
12e00 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
12e10 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
12e20 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
12e30 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
12e40 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
12e50 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
12e60 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
12e70 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
12e80 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
12e90 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
12ea0 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
12eb0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
12ec0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
12ed0 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
12ee0 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
12ef0 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
12f00 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
12f10 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
12f20 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
12f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
12f40 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
12f50 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
12f60 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
12f70 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
12f80 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
12f90 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
12fa0 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
12fb0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
12fc0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12fe0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
12ff0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
13000 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
13010 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
13020 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
13030 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
13040 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
13050 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
13060 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
13070 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
13080 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
13090 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
130a0 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
130b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
130c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
130d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
130e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
130f0 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
13100 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
13110 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13120 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
13130 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
13140 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
13150 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13160 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
13170 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
13180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13190 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
131a0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
131b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
131c0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
131d0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
131e0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
131f0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
13200 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
13210 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
13220 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
13230 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13240 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
13250 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
13260 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
13270 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
13280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
13290 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
132a0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
132b0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
132c0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
132d0 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
132e0 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
132f0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
13300 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
13310 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
13320 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
13330 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
13340 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
13350 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
13360 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
13370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13380 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
13390 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
133a0 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
133b0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
133c0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
133d0 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
133e0 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
133f0 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
13400 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13410 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
13420 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13430 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
13440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
13450 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
13460 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13470 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
13480 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
13490 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
134a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
134b0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
134c0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
134d0 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
134e0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
134f0 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
13500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13510 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
13520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13530 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
13540 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
13550 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13570 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
13580 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
13590 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
135a0 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
135b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
135c0 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74   the cost C by t
135d0 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74  he costMult fact
135e0 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79  er T.  This only
135f0 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f   occurs if.** co
13600 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
13610 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
13620 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53  MULT.*/.#ifdef S
13630 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
13640 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41  TMULT.# define A
13650 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
13660 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a  er(C,T)  C += T.
13670 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
13680 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
13690 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a  er(C,T).#endif..
136a0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
136b0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
136c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
136d0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
136e0 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  f the .** index 
136f0 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d  pIndex. Try to m
13700 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
13710 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
13720 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13730 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  d, pBuilder->pNe
13740 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73  w->nOut contains
13750 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
13760 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
13770 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62   to be visited b
13780 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e  y filtering usin
13790 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65  g the nEq .** te
137a0 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20  rms only. If it 
137b0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  is modified, thi
137c0 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f  s value is resto
137d0 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  red before this 
137e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
137f0 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  urns..**.** If p
13800 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
13810 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
13820 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
13830 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
13840 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
13850 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
13860 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
13870 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
13880 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
13890 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
138a0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
138b0 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
138c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
138d0 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
138e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
138f0 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
13900 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
13910 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
13920 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
13930 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
13940 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13960 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
13970 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
13980 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
13990 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
139a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
139b0 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
139c0 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
139d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
139e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
139f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
13a00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13a10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13a20 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
13a30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13a40 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
13a50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
13a60 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
13a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13a80 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
13a90 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
13aa0 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
13ab0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
13ad0 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
13ae0 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
13af0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
13b20 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
13b30 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
13b40 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
13b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
13b60 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
13b70 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
13b80 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
13b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13ba0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13bb0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
13bc0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
13bd0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
13be0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13bf0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
13c00 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
13c10 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
13c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
13c30 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
13c40 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
13c50 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
13c60 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
13c70 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13c80 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13c90 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
13ca0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
13cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13cc0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13cd0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
13ce0 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
13cf0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
13d00 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
13d10 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
13d20 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ut */.  int rc =
13d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13d40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
13d50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
13d60 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
13d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13d80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
13d90 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
13da0 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
13dd0 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
13de0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
13df0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
13e00 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
13e10 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
13e20 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
13e30 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
13e40 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13e50 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
13e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13e70 50 54 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  PT;..  assert( (
13e80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
13e90 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
13ea0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
13eb0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13ec0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
13ed0 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
13ee0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
13ef0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
13f00 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
13f10 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
13f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
13f30 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
13f40 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
13f50 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55  LT|WO_LE|WO_ISNU
13f60 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20  LL|WO_IS;.  }.  
13f70 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
13f80 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
13f90 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
13fa0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
13fb0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
13fc0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
13fd0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a  be->nColumn );..
13fe0 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
13ff0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14000 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
14010 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20   pNew->nSkip;.  
14020 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
14030 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
14040 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
14050 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
14060 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
14070 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
14080 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
14090 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20  ->nOut;.  pTerm 
140a0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
140b0 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
140c0 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
140d0 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a  sor, saved_nEq,.
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140f0 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
14100 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d  pProbe);.  pNew-
14110 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72  >rSetup = 0;.  r
14120 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
14130 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
14140 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
14150 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72  og(rSize);.  for
14160 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
14170 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
14180 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
14190 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
141a0 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d   u16 eOp = pTerm
141b0 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f  ->eOperator;   /
141c0 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
141d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
141e0 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72   */.    LogEst r
141f0 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67  CostIdx;.    Log
14200 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  Est nOutUnadjust
14210 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f  ed;        /* nO
14220 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61  ut before IN() a
14230 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d  nd WHERE adjustm
14240 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
14250 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nIn = 0;.#ifdef 
14260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14270 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
14280 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
14290 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
142a0 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
142b0 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53   if( (eOp==WO_IS
142c0 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
142d0 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
142e0 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
142f0 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
14300 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64  ll(pProbe, saved
14310 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  _nEq).    ){.   
14320 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
14330 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
14340 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
14350 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
14360 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
14370 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
14380 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
14390 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
143a0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
143b0 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
143c0 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
143d0 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
143e0 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
143f0 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
14400 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
14410 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
14420 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
14430 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
14440 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14450 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
14460 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
14470 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
14480 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
14490 61 6c 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61  allow IS constra
144a0 69 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48  ints from the WH
144b0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
144c0 20 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20   used by the.   
144d0 20 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20   ** right table 
144e0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
144f0 20 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74   Only constraint
14500 73 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  s in the ON clau
14510 73 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c  se are.    ** al
14520 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  lowed */.    if(
14530 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74   (pSrc->fg.joint
14540 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
14550 30 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48  0.     && !ExprH
14560 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
14570 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
14580 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65  Join).     && (e
14590 4f 70 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49  Op & (WO_IS|WO_I
145a0 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29  SNULL))!=0.    )
145b0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
145c0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b  ( eOp & WO_IS );
145d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
145e0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
145f0 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
14600 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
14610 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
14620 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
14630 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
14640 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
14650 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
14660 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
14670 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
14680 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
14690 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
146a0 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
146b0 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  OOM */.    pNew-
146c0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
146d0 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  Term++] = pTerm;
146e0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
146f0 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65  q = (saved_prere
14700 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
14710 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d  qRight) & ~pNew-
14720 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20  >maskSelf;..    
14730 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d  assert( nInMul==
14740 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e  0.        || (pN
14750 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
14760 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
14770 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
14780 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
14790 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
147a0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
147b0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
147c0 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
147d0 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20  )!=0 .    );..  
147e0 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
147f0 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
14800 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
14810 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
14820 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
14830 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
14840 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
14850 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14860 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
14870 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
14880 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
14890 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
148a0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
148b0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
148c0 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
148d0 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
148e0 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
148f0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
14900 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
14910 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
14920 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
14930 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
14940 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
14950 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
14960 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
14970 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
14980 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
14990 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
149a0 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
149b0 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
149c0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
149d0 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
14a00 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
14a10 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d  "x=?". */..    }
14a20 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
14a30 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
14a40 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
14a50 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
14a60 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20  n[saved_nEq];.  
14a70 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14a80 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14a90 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65  N_EQ;.      asse
14aa0 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70  rt( saved_nEq==p
14ab0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14ac0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
14ad0 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20  ol==XN_ROWID .  
14ae0 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 30 20       || (iCol>0 
14af0 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20  && nInMul==0 && 
14b00 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
14b10 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20  e->nKeyCol-1).  
14b20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
14b30 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50  f( iCol>=0 && pP
14b40 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  robe->uniqNotNul
14b50 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
14b60 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
14b70 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  |= WHERE_UNQ_WAN
14b80 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  TED;.        }el
14b90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
14ba0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14bb0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
14bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
14be0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
14bf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14c00 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
14c10 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65  UMN_NULL;.    }e
14c20 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
14c30 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
14c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14c50 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  Op & WO_GT );.  
14c60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14c70 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  p & WO_GE );.   
14c80 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14c90 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
14ca0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
14cb0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42  _LIMIT;.      pB
14cc0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
14cd0 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
14ce0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
14cf0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
14d00 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
14d10 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
14d20 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
14d30 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
14d40 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
14d50 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
14d60 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
14d70 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
14d80 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
14d90 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
14da0 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
14db0 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
14dc0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
14dd0 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
14de0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
14df0 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
14e00 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
14e10 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
14e20 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
14e30 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
14e40 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
14e50 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
14e60 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
14e70 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
14e80 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
14e90 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
14ea0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14eb0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
14ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14ed0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
14ee0 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
14ef0 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
14f00 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14f10 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
14f20 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14f30 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
14f40 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14f50 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
14f60 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
14f70 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
14f80 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
14f90 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
14fa0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
14fb0 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
14fd0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
14fe0 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
14ff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
15000 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77   this point pNew
15010 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ->nOut is set to
15020 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
15030 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ows expected to.
15040 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65      ** be visite
15050 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73  d by the index s
15060 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69  can before consi
15070 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72  dering term pTer
15080 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  m, or the.    **
15090 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61   values of nIn a
150a0 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74  nd nInMul. In ot
150b0 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
150c0 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20  ing that all .  
150d0 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22    ** "x IN(...)"
150e0 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61   terms are repla
150f0 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22  ced with "x = ?"
15100 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64  . This block upd
15110 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ates.    ** the 
15120 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
15130 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Out to account f
15140 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f  or pTerm (but no
15150 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20  t nIn/nInMul).  
15160 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15170 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
15180 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28  _nOut );.    if(
15190 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
151a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
151b0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
151c0 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e  Adjust nOut usin
151d0 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61  g stat3/stat4 da
151e0 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ta. Or, if there
151f0 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61   is no stat3/sta
15200 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  t4.      ** data
15210 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68  , using some oth
15220 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f  er estimate.  */
15230 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
15240 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
15250 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c   pBuilder, pBtm,
15260 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20   pTop, pNew);.  
15270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
15280 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d  nt nEq = ++pNew-
15290 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
152a0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
152b0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
152c0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20  EQ|WO_IN|WO_IS) 
152d0 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
152e0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
152f0 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
15300 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
15310 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72  thProb<=0 && pPr
15320 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61  obe->aiColumn[sa
15330 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20  ved_nEq]>=0 ){. 
15340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
15350 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20  eOp & WO_IN) || 
15360 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nIn==0 );.      
15370 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15380 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20  & WO_IN );.     
15390 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
153a0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
153b0 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  b;.        pNew-
153c0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
153d0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
153e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
153f0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
15400 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e         tRowcnt n
15410 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Out = 0;.       
15420 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a   if( nInMul==0 .
15430 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
15440 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
15450 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75        && pNew->u
15460 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
15470 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  be->nSampleCol. 
15480 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70          && ((eOp
15490 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20   & WO_IN)==0 || 
154a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
154b0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
154c0 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20  P_xIsSelect)).  
154d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
154e0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
154f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
15500 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
15510 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
15520 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20  NULL|WO_IS))!=0 
15530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
15540 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
15550 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
15560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
15570 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  p & WO_IS );.   
15580 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
15590 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  e( eOp & WO_ISNU
155a0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  LL );.          
155b0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
155c0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
155d0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
155e0 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
155f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
15600 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
15610 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
15620 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
15630 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
15640 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
15650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15670 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
15680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15690 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
156a0 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
156b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
156c0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54  mp out of the pT
156d0 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  erm loop */.    
156e0 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29        if( nOut )
156f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
15700 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
15710 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a  e3LogEst(nOut);.
15720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15730 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
15740 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
15750 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
15760 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
15770 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
15780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
157a0 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64  ( nOut==0 ).#end
157b0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
157c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
157d0 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69  t += (pProbe->ai
157e0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d  RowLogEst[nEq] -
157f0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
15800 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20  gEst[nEq-1]);.  
15810 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20          if( eOp 
15820 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
15830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55             /* TU
15840 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
15850 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  s no likelihood(
15860 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20  ) value, assume 
15870 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20  that a .        
15880 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e      ** "col IS N
15890 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ULL" expression 
158a0 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73  matches twice as
158b0 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20   many rows .    
158c0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63          ** as (c
158d0 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ol=?). */.      
158e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
158f0 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   += 10;.        
15900 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
15920 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78   /* Set rCostIdx
15930 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
15940 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65  visiting selecte
15950 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e  d rows in index.
15960 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74   Add.    ** it t
15970 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68  o pNew->rRun, wh
15980 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ich is currently
15990 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74   set to the cost
159a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
159b0 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20    ** seek only. 
159c0 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73  Then, if this is
159d0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
159e0 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63  index, add the c
159f0 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69  ost of.    ** vi
15a00 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20  siting the rows 
15a10 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
15a20 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74  e.  */.    rCost
15a30 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Idx = pNew->nOut
15a40 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
15a50 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72  e->szIdxRow)/pSr
15a60 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
15a70 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  w;.    pNew->rRu
15a80 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
15a90 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72  tAdd(rLogSize, r
15aa0 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66  CostIdx);.    if
15ab0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15ac0 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
15ad0 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
15ae0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
15af0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
15b00 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
15b10 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  Run, pNew->nOut 
15b20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20  + 16);.    }.   
15b30 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
15b40 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
15b50 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
15b60 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20  >costMult);..   
15b70 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20   nOutUnadjusted 
15b80 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
15b90 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
15ba0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
15bb0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
15bc0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
15bd0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
15be0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
15bf0 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  ->pWC, pNew, rSi
15c00 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ze);.    rc = wh
15c10 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
15c20 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
15c30 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
15c40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
15c50 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
15c60 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15c70 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
15c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
15c90 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
15ca0 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
15cb0 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
15cc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15cd0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
15ce0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
15cf0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
15d00 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
15d10 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
15d20 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
15d30 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
15d40 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
15d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
15d60 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15d70 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
15d80 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
15d90 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  OR_STAT4.    pBu
15da0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
15db0 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
15dc0 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
15dd0 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
15de0 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
15df0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
15e00 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
15e10 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
15e20 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
15e30 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15e40 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
15e50 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15e60 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
15e70 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
15e80 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
15e90 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
15ea0 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
15eb0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
15ec0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
15ed0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
15ee0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
15ef0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
15f00 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
15f10 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
15f20 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
15f30 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
15f40 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
15f50 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
15f60 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
15f70 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
15f80 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
15f90 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
15fa0 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
15fb0 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
15fc0 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
15fd0 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
15fe0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
15ff0 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
16000 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
16010 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
16020 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
16030 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
16040 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
16050 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
16060 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
16070 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
16080 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
16090 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
160a0 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
160b0 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
160c0 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
160d0 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
160e0 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
160f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
16100 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
16110 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
16120 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
16130 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
16140 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
16150 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
16160 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
16170 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
16180 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
16190 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
161a0 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
161b0 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
161c0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
161d0 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
161e0 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
161f0 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
16200 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
16210 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
16220 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
16230 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
16240 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
16250 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
16260 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
16270 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
16280 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
16290 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
162a0 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
162b0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
162c0 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
162d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
162e0 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
162f0 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
16300 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
16310 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
16320 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
16330 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
16340 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
16350 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
16360 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
16370 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
16380 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
16390 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
163a0 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
163b0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
163c0 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
163d0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
163e0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
163f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
16400 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
16410 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
16420 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
16430 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
16440 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
16450 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ags;.  }..  retu
16460 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16470 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
16480 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
16490 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
164a0 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
164b0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
164c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
164d0 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
164e0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
164f0 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
16500 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
16510 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16520 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
16530 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
16540 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
16550 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
16560 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
16570 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
16580 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
16590 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
165a0 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
165b0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
165c0 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
165d0 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
165e0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
165f0 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  pOB;.  ExprList 
16600 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74  *aColExpr;.  int
16610 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
16620 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
16630 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
16640 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
16650 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
16660 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
16670 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
16680 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
16690 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
166a0 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
166b0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
166c0 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
166d0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
166e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
166f0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
16700 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le==iCursor ){. 
16710 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
16720 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
16730 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  rn 1;.      for(
16740 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
16750 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
16760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
16770 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
16780 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
16790 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
167a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
167b0 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20  if( (aColExpr = 
167c0 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
167d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
167e0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
167f0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
16800 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
16810 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
16820 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63  jj]!=XN_EXPR ) c
16830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
16840 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16850 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 61 43  Compare(pExpr,aC
16860 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45  olExpr->a[jj].pE
16870 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20  xpr,iCursor)==0 
16880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16890 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
168a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
168b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
168c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
168d0 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
168e0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
168f0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16900 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
16910 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
16920 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
16930 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
16940 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
16950 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
16960 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
16970 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
16980 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
16990 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
169a0 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
169b0 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
169c0 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
169d0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
169e0 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
169f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
16a00 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
16a10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16a20 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
16a30 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
16a40 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
16a50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
16a60 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
16a70 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
16a80 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
16a90 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
16aa0 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
16ab0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
16ac0 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
16ad0 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
16ae0 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
16af0 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
16b00 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
16b10 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
16b20 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
16b30 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
16b40 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
16b50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
16b60 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65  m;.  while( pWhe
16b70 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
16b80 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65  {.    if( !where
16b90 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
16ba0 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65  ex(iTab,pWC,pWhe
16bb0 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  re->pLeft) ) ret
16bc0 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72  urn 0;.    pWher
16bd0 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67  e = pWhere->pRig
16be0 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ht;.  }.  for(i=
16bf0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
16c00 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
16c10 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
16c20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
16c30 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
16c40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
16c50 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78  rImpliesExpr(pEx
16c60 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
16c70 29 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70  ) .     && (!Exp
16c80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16c90 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
16ca0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
16cb0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62  tJoinTable==iTab
16cc0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
16cd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16ce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16cf0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
16d00 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
16d10 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
16d20 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
16d30 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
16d40 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
16d50 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
16d60 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
16d70 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
16d80 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
16d90 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
16da0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
16db0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
16dc0 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
16dd0 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
16de0 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
16df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
16e00 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
16e10 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
16e20 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
16e30 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
16e40 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
16e50 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
16e60 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
16e70 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
16ea0 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
16eb0 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
16ee0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
16ef0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
16f00 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
16f10 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
16f20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
16f30 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
16f40 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
16f50 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
16f60 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
16f70 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
16f80 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
16f90 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
16fa0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
16fb0 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
16fc0 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
16fd0 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
16fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
16ff0 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
17000 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
17010 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
17020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
17030 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
17040 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
17050 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
17060 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
17070 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
17080 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
17090 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
170a0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
170b0 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
170c0 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
170d0 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
170e0 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
170f0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
17100 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
17110 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
17120 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
17130 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
17140 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
17150 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
17160 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
17170 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
17180 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
17190 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
171a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
171b0 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
171c0 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
171d0 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ip-scans..**.** 
171e0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61  The estimated va
171f0 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73  lues (nRow, nVis
17200 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e  it, nSeek) often
17210 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65   contain a large
17220 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e   amount.** of un
17230 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20  certainty.  For 
17240 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f  this reason, sco
17250 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64  ring is designed
17260 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74   to pick plans t
17270 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c  hat.** "do the l
17280 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68  east harm" if th
17290 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20  e estimates are 
172a0 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72  inaccurate.  For
172b0 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c   example, a.** l
172c0 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20  og(nRow) factor 
172d0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
172e0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
172f0 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64  ndex scan in ord
17300 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68  er to.** bias th
17310 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76  e scoring in fav
17320 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  or of using an i
17330 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20  ndex, since the 
17340 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65  worst-case.** pe
17350 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69  rformance of usi
17360 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66  ng an index is f
17370 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  ar better than t
17380 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65  he worst-case pe
17390 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20  rformance.** of 
173a0 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
173b0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
173c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
173d0 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
173e0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
173f0 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
17400 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
17410 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
17420 65 71 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  eq             /
17430 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
17440 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
17450 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
17460 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
17470 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
17480 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
17490 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
174a0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
174b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
174c0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
174d0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
174e0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
174f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
17500 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
17510 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
17520 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  key */.  LogEst 
17530 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
17540 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
17550 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20  wLogEst[] value 
17560 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
17570 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c  x */.  i16 aiCol
17580 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
17590 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
175a0 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
175b0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
175c0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
175d0 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
175e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
175f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
17600 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
17610 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
17620 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
17630 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
17640 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
17650 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
17660 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
17670 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
17680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
17690 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
176a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
176b0 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
176c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
176d0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
17700 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f  an value */.  Lo
17710 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
17720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
17730 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
17740 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
17750 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
17760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
17770 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
17780 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
17790 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
177a0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
177b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
177c0 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
177d0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
177e0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
177f0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
17800 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
17810 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
17820 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
17830 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
17840 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
17850 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
17860 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
17870 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
17880 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54  pNew->iTab;.  pT
17890 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
178a0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
178b0 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
178c0 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
178d0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
178e0 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
178f0 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
17900 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
17910 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
17920 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
17930 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
17940 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e  be = pSrc->pIBIn
17950 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
17960 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
17970 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
17980 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
17990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
179a0 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
179b0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
179c0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
179d0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
179e0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
179f0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
17a00 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
17a10 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
17a20 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
17a30 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
17a40 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
17a50 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
17a60 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
17a70 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
17a80 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
17a90 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
17aa0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
17ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
17ac0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
17ad0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
17ae0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
17af0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
17b00 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
17b10 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
17b20 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
17b30 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
17b40 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
17b50 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
17b60 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
17b70 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
17b80 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
17b90 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
17ba0 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
17bb0 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
17bc0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69  szTabRow;.    ai
17bd0 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
17be0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
17bf0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
17c00 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73  ] = 0;.    pFirs
17c10 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
17c20 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
17c30 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  pSrc->fg.notInde
17c40 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
17c50 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
17c60 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
17c70 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
17c80 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
17c90 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
17ca0 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
17cb0 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
17cc0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
17cd0 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
17ce0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
17cf0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
17d00 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
17d10 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
17d20 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
17d30 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
17d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17d50 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
17d60 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
17d70 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
17d80 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
17d90 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  Set      /* Not 
17da0 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70  part of an OR op
17db0 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  timization */.  
17dc0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
17dd0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
17de0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
17df0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
17e00 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
17e10 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
17e20 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70  ndex)!=0.   && p
17e30 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30  Src->pIBIndex==0
17e40 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
17e50 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
17e60 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  e */.   && !pSrc
17e70 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
17e80 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20    /* Has no NOT 
17e90 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a  INDEXED clause *
17ea0 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  /.   && HasRowid
17eb0 28 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f  (pTab)         /
17ec0 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f  * Not WITHOUT RO
17ed0 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d  WID table. (FIXM
17ee0 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a  E: Why not?) */.
17ef0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
17f00 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20  isCorrelated /* 
17f10 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
17f20 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
17f30 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52  && !pSrc->fg.isR
17f40 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74  ecursive  /* Not
17f50 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d   a recursive com
17f60 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
17f70 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20  sion. */.  ){.  
17f80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
17f90 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
17fa0 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
17fb0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
17fc0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
17fd0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
17fe0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
17ff0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
18000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18010 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
18020 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
18030 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
18040 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
18050 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
18060 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
18070 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
18080 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
18090 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
180a0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
180b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
180c0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Skip = 0;.      
180d0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
180e0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
180f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
18100 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
18110 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
18120 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f  pTerm;.        /
18130 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69  * TUNING: One-ti
18140 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70  me cost for comp
18150 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  uting the automa
18160 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20  tic index is.   
18170 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65       ** estimate
18180 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32  d to be X*N*log2
18190 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
181a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
181b0 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
181c0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
181d0 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72  indexed and wher
181e0 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74  e X is 7 (LogEst
181f0 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a  =28) for normal.
18200 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18210 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45  s or 1.375 (LogE
18220 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20  st=4) for views 
18230 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e 20  and subqueries. 
18240 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   The value.     
18250 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d     ** of X is sm
18260 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20  aller for views 
18270 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 73  and subqueries s
18280 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  o that the query
18290 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20   planner.       
182a0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65   ** will be more
182b0 20 61 67 67 72 65 73 73 69 76 65 20 61 62 6f 75   aggressive abou
182c0 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74  t generating aut
182d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 66  omatic indexes f
182e0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  or.        ** th
182f0 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e  ose objects, sin
18300 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  ce there is no o
18310 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64  pportunity to ad
18320 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20  d schema.       
18330 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73   ** indexes on s
18340 75 62 71 75 65 72 69 65 73 20 61 6e 64 20 76 69  ubqueries and vi
18350 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ews. */.        
18360 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
18370 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
18380 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + 4;.        if(
18390 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
183a0 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  0 && (pTab->tabF
183b0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
183c0 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ral)==0 ){.     
183d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
183e0 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20  p += 24;.       
183f0 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
18400 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18410 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61  New->rSetup, pTa
18420 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
18430 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
18440 72 53 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d  rSetup<0 ) pNew-
18450 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
18460 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
18470 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  Each index looku
18480 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73  p yields 20 rows
18490 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
184a0 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  This.        ** 
184b0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  is more than the
184c0 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20   usual guess of 
184d0 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77  10 rows, since w
184e0 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20  e have no way.  
184f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77        ** of know
18500 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
18510 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
18520 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
18530 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
18540 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
18550 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
18560 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
18570 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
18580 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18590 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
185a0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
185b0 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  20) );.        p
185c0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
185d0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
185e0 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
185f0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
18600 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
18610 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
18620 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
18630 71 20 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54  q = mPrereq | pT
18640 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
18650 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
18660 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
18670 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
18680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18690 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
186a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
186b0 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a  C_INDEX */..  /*
186c0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
186d0 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ndices.  */.  fo
186e0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
186f0 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72  K && pProbe; pPr
18700 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
18710 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a  t, iSortIdx++){.
18720 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
18730 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
18740 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55  .     && !whereU
18750 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
18760 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  x(pSrc->iCursor,
18770 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50   pWC, pProbe->pP
18780 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a  artIdxWhere) ){.
18790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
187a0 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63  pNew->iTab!=pSrc
187b0 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a  ->iCursor );  /*
187c0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64   See ticket [98d
187d0 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20  973b8f5] */.    
187e0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
187f0 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
18800 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
18810 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
18820 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20    }.    rSize = 
18830 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
18840 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77  Est[0];.    pNew
18850 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
18860 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  0;.    pNew->nSk
18870 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ip = 0;.    pNew
18880 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
18890 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
188a0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
188b0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
188c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
188d0 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77  Prereq;.    pNew
188e0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
188f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
18900 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
18910 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
18920 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
18930 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
18940 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
18950 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
18960 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
18970 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
18980 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
18990 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
189a0 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
189b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
189c0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
189d0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
189e0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
189f0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
18a00 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
18a10 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
18a20 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
18a30 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
18a40 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
18a50 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
18a60 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
18a70 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
18a80 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
18a90 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
18aa0 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
18ab0 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30  e scan is (N*3.0
18ac0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ). */.      pNew
18ad0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
18ae0 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79   16;.      Apply
18af0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18b00 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
18b10 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
18b20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
18b30 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
18b40 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
18b50 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
18b60 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
18b70 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
18b80 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
18b90 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
18ba0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
18bb0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
18bc0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
18bd0 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
18be0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
18bf0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
18c00 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
18c10 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
18c20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
18c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
18c40 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
18c50 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
18c60 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
18c70 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
18c80 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
18c90 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
18ca0 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
18cb0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
18cc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
18cd0 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
18ce0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
18cf0 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
18d00 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
18d10 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50     || pProbe->pP
18d20 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
18d30 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
18d40 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
18d50 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
18d60 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
18d70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
18d80 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
18d90 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
18da0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
18db0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
18dc0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
18dd0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
18de0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
18df0 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
18e00 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
18e10 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
18e20 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
18e30 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
18e40 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
18e50 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
18e60 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
18e70 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
18e80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
18e90 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
18ea0 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
18eb0 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
18ec0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
18ed0 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
18ee0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
18ef0 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
18f00 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
18f10 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
18f20 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  e rows. */.     
18f30 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
18f40 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a  rSize + 1 + (15*
18f50 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
18f60 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  )/pTab->szTabRow
18f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21  ;.        if( m!
18f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
18f90 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
18fa0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18fb0 65 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20  ex scan, add in 
18fc0 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20  the cost of.    
18fd0 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74        ** doing t
18fe0 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54  able lookups.  T
18ff0 68 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20  he cost will be 
19000 33 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  3x the number of
19010 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  .          ** lo
19020 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74  okups.  Take int
19030 6f 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20  o account WHERE 
19040 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
19050 74 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20  t can be.       
19060 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20     ** satisfied 
19070 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
19080 6e 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64  ndex, and that d
19090 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  o not require a.
190a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
190b0 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20  le lookup. */.  
190c0 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e          LogEst n
190d0 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b  Lookup = rSize +
190e0 20 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f   16;  /* Base co
190f0 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20  st:  N*3 */.    
19100 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
19110 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72          int iCur
19120 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
19130 3b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  ;.          Wher
19140 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 26  eClause *pWC = &
19150 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20  pWInfo->sWC;.   
19160 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
19170 20 69 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20   ii<pWC->nTerm; 
19180 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
19190 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
191a0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 69  erm = &pWC->a[ii
191b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
191c0 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
191d0 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 70 54  overedByIndex(pT
191e0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72  erm->pExpr, iCur
191f0 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
19200 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
19220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
19230 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c  Term can be eval
19240 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74  uated using just
19250 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20   the index.  So 
19260 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20  reduce.         
19270 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74     ** the expect
19280 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  ed number of tab
19290 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72  le lookups accor
192a0 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20  dingly */.      
192b0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
192c0 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
192d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
192e0 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d  Lookup += pTerm-
192f0 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
19300 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
19320 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20  okup--;.        
19330 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
19340 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
19350 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f  _EQ|WO_IS) ) nLo
19360 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20  okup -= 19;.    
19370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19390 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
193a0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
193b0 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
193c0 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20  Run, nLookup);. 
193d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
193e0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
193f0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
19400 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
19410 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
19420 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
19430 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
19440 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19450 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
19460 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
19470 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
19480 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
19490 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
194a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
194b0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65   }..    rc = whe
194c0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
194d0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
194e0 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a  rc, pProbe, 0);.
194f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19500 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
19510 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53  AT4.    sqlite3S
19520 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42  tat4ProbeFree(pB
19530 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20  uilder->pRec);. 
19540 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
19550 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  cValid = 0;.    
19560 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
19570 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
19580 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
19590 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
195a0 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
195b0 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
195c0 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
195d0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
195e0 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29  pSrc->pIBIndex )
195f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
19600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
19610 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19620 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a  VIRTUALTABLE../*
19630 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64  .** Argument pId
19640 78 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79  xInfo is already
19650 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
19660 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  all constraints 
19670 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75  that may.** be u
19680 73 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75  sed by the virtu
19690 61 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  al table identif
196a0 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
196b0 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69  >pNew->iTab. Thi
196c0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61  s.** function ma
196d0 72 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66 20  rks a subset of 
196e0 74 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  those constraint
196f0 73 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65  s usable, invoke
19700 73 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e  s the.** xBestIn
19710 64 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61  dex method and a
19720 64 64 73 20 74 68 65 20 72 65 74 75 72 6e 65 64  dds the returned
19730 20 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65   plan to pBuilde
19740 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74  r..**.** A const
19750 72 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20  raint is marked 
19760 75 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a  usable if:.**.**
19770 20 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55     * Argument mU
19780 73 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20  sable indicates 
19790 74 68 61 74 20 69 74 73 20 70 72 65 72 65 71 75  that its prerequ
197a0 69 73 69 74 65 73 20 61 72 65 20 61 76 61 69 6c  isites are avail
197b0 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  able, and.**.** 
197c0 20 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e    * It is not on
197d0 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
197e0 72 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  rs specified in 
197f0 74 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73  the mExclude mas
19800 6b 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20  k passed.**     
19810 61 73 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  as the fourth ar
19820 67 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e  gument (which in
19830 20 70 72 61 63 74 69 63 65 20 69 73 20 65 69 74   practice is eit
19840 68 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e  her WO_IN or 0).
19850 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
19860 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73  mPrereq is a mas
19870 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  k of tables that
19880 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
19890 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76   before the.** v
198a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
198b0 71 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20  question. These 
198c0 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
198d0 20 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73   plans prerequis
198e0 69 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69  ites.** before i
198f0 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 70 42  t is added to pB
19900 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75  uilder..**.** Ou
19910 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
19920 70 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74  pbIn is set to t
19930 72 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20  rue if the plan 
19940 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65  added to pBuilde
19950 72 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72  r.** uses one or
19960 20 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d   more WO_IN term
19970 73 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  s, or false othe
19980 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
19990 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
199a0 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57  dVirtualOne(.  W
199b0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
199c0 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74  *pBuilder,.  Bit
199d0 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20  mask mPrereq,   
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
199f0 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74  Mask of tables t
19a00 68 61 74 20 6d 75 73 74 20 62 65 20 75 73 65 64  hat must be used
19a10 2e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  . */.  Bitmask m
19a20 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  Usable,         
19a30 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
19a40 66 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20  f usable tables 
19a50 2a 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64  */.  u16 mExclud
19a60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
19a70 20 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20       /* Exclude 
19a80 74 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73  terms using thes
19a90 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  e operators */. 
19aa0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
19ab0 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20  nfo *pIdxInfo,  
19ac0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62   /* Populated ob
19ad0 6a 65 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e  ject for xBestIn
19ae0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  dex */.  int *pb
19af0 49 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  In              
19b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
19b10 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
19b20 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70  es an IN(...) op
19b30 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c   */.){.  WhereCl
19b40 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69  ause *pWC = pBui
19b50 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72  lder->pWC;.  str
19b60 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
19b70 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
19b80 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
19b90 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
19ba0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
19bb0 2a 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e  *pUsage = pIdxIn
19bc0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
19bd0 73 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sage;.  int i;. 
19be0 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69   int mxTerm;.  i
19bf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19c00 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
19c10 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
19c20 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a  >pNew;.  Parse *
19c30 70 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65  pParse = pBuilde
19c40 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  r->pWInfo->pPars
19c50 65 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  e;.  struct SrcL
19c60 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d  ist_item *pSrc =
19c70 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e   &pBuilder->pWIn
19c80 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
19c90 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69  pNew->iTab];.  i
19ca0 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
19cb0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
19cc0 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72  traint;..  asser
19cd0 74 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50  t( (mUsable & mP
19ce0 72 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20  rereq)==mPrereq 
19cf0 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a  );.  *pbIn = 0;.
19d00 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
19d10 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20   mPrereq;..  /* 
19d20 53 65 74 20 74 68 65 20 75 73 61 62 6c 65 20 66  Set the usable f
19d30 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65  lag on the subse
19d40 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  t of constraints
19d50 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
19d60 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d    ** arguments m
19d70 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c  Usable and mExcl
19d80 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f  ude. */.  pIdxCo
19d90 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
19da0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
19db0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
19dc0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
19dd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
19de0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
19df0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
19e00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
19e10 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78  m = &pWC->a[pIdx
19e20 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
19e30 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  t];.    pIdxCons
19e40 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
19e50 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
19e60 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 73 61  ereqRight & mUsa
19e70 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65  ble)==pTerm->pre
19e80 72 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 26  reqRight .     &
19e90 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
19ea0 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d  tor & mExclude)=
19eb0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
19ec0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
19ed0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
19ee0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
19ef0 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c   the output fiel
19f00 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ds of the sqlite
19f10 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
19f20 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73  ucture */.  mems
19f30 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
19f40 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
19f50 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
19f60 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f  assert( pIdxInfo
19f70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
19f80 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49  tr==0 );.  pIdxI
19f90 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
19fa0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
19fb0 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Num = 0;.  pIdxI
19fc0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
19fd0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78  umed = 0;.  pIdx
19fe0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
19ff0 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
1a000 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
1a010 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
1a020 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35  timatedRows = 25
1a030 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
1a040 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49  xFlags = 0;.  pI
1a050 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20  dxInfo->colUsed 
1a060 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
1a070 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a  )pSrc->colUsed;.
1a080 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
1a090 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
1a0a0 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68  BestIndex() meth
1a0b0 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61  od */.  rc = vta
1a0c0 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
1a0d0 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70  e, pSrc->pTab, p
1a0e0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  IdxInfo);.  if( 
1a0f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a100 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a  .  mxTerm = -1;.
1a110 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1a120 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61  nLSlot>=nConstra
1a130 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  int );.  for(i=0
1a140 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
1a150 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
1a160 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65  rm[i] = 0;.  pNe
1a170 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1a180 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f  sk = 0;.  pIdxCo
1a190 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
1a1a0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1a1b0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
1a1c0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
1a1d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1a1e0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
1a1f0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
1a200 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
1a210 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73  if( (iTerm = pUs
1a220 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
1a230 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20   - 1)>=0 ){.    
1a240 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1a250 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  rm;.      int j 
1a260 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
1a270 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  mOffset;.      i
1a280 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
1a290 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20  raint.       || 
1a2a0 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e  j<0.       || j>
1a2b0 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
1a2c0 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
1a2d0 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
1a2e0 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d      || pIdxCons-
1a2f0 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20  >usable==0.     
1a300 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a310 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1a320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a330 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
1a340 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c  s.xBestIndex mal
1a350 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
1a360 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1a370 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1a390 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1a3a0 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
1a3b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a3c0 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
1a3d0 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
1a3e0 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
1a3f0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
1a400 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
1a410 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
1a420 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1a430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
1a440 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
1a450 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
1a460 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1a470 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
1a480 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
1a490 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
1a4a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a4b0 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
1a4c0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1a4d0 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
1a4e0 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
1a4f0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
1a500 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1a510 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
1a520 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
1a530 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1a540 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
1a550 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1a560 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1a570 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1a580 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1a590 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
1a5a0 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
1a5b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
1a5c0 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
1a5d0 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
1a5e0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
1a5f0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
1a600 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
1a610 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
1a620 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
1a630 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
1a640 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
1a650 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
1a660 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
1a670 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
1a680 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
1a690 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1a6a0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
1a6b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
1a6c0 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
1a6d0 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
1a6e0 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
1a6f0 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20  In = 1; assert( 
1a700 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49  (mExclude & WO_I
1a710 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  N)==0 );.      }
1a720 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4e  .    }.  }..  pN
1a730 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
1a740 65 72 6d 2b 31 3b 0a 20 20 61 73 73 65 72 74 28  erm+1;.  assert(
1a750 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
1a760 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
1a770 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1a780 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
1a790 3e 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d  >idxNum;.  pNew-
1a7a0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1a7b0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
1a7c0 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
1a7d0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1a7e0 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
1a7f0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1a800 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
1a810 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65  o->idxStr;.  pNe
1a820 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
1a830 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
1a840 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1a850 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64  umed ?.      pId
1a860 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
1a870 3a 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  : 0);.  pNew->rS
1a880 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
1a890 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1a8a0 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
1a8b0 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1a8c0 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65  atedCost);.  pNe
1a8d0 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
1a8e0 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
1a8f0 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
1a900 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1a910 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61  WHERE_ONEROW fla
1a920 67 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e  g if the xBestIn
1a930 64 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64  dex() method ind
1a940 69 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74  icated.  ** that
1a950 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
1a960 69 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65  isit at most one
1a970 20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f   row. Clear it o
1a980 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69  therwise. */.  i
1a990 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  f( pIdxInfo->idx
1a9a0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  Flags & SQLITE_I
1a9b0 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
1a9c0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   ){.    pNew->ws
1a9d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
1a9e0 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NEROW;.  }else{.
1a9f0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1aa00 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52  s &= ~WHERE_ONER
1aa10 4f 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77  OW;.  }.  rc = w
1aa20 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1aa30 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1aa40 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
1aa50 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
1aa60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1aa70 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1aa80 53 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Str);.    pNew->
1aa90 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1aaa0 3d 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45  = 0;.  }.  WHERE
1aab0 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
1aac0 20 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49    bIn=%d prereqI
1aad0 6e 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f  n=%04llx prereqO
1aae0 75 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  ut=%04llx\n",.  
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 20 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69      *pbIn, (sqli
1ab10 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72  te3_uint64)mPrer
1ab20 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
1ab30 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1ab40 65 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d  e3_uint64)(pNew-
1ab50 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1ab60 65 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eq)));..  return
1ab70 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   rc;.}.../*.** A
1ab80 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1ab90 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74   objects for a t
1aba0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
1abb0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
1abc0 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  * pBuilder->pNew
1abd0 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
1abe0 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
1abf0 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61  d to be a virtua
1ac00 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
1ac10 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c  f there are no L
1ac20 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1ac30 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71  N joins in the q
1ac40 75 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72  uery, both mPrer
1ac50 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61  eq and.** mUnusa
1ac60 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20 30  ble are set to 0
1ac70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72  . Otherwise, mPr
1ac80 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f  ereq is a mask o
1ac90 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  f all FROM claus
1aca0 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  e.** entries tha
1acb0 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1acc0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1acd0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1ace0 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73  use and are.** s
1acf0 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
1ad00 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
1ad10 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
1ad20 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  OIN. Similarly, 
1ad30 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  the.** mUnusable
1ad40 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61   mask contains a
1ad50 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ll FROM clause e
1ad60 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
1ad70 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76  r after the.** v
1ad80 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64  irtual table and
1ad90 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66   are separated f
1ada0 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61  rom it by at lea
1adb0 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a  st one LEFT or .
1adc0 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a  ** CROSS JOIN. .
1add0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1ade0 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  e, if the query 
1adf0 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  were:.**.**   ..
1ae00 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45  . FROM t1, t2 LE
1ae10 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20  FT JOIN t3, t4, 
1ae20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35  vt CROSS JOIN t5
1ae30 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , t6;.**.** then
1ae40 20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73 70   mPrereq corresp
1ae50 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29  onds to (t1, t2)
1ae60 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74   and mUnusable t
1ae70 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a  o (t5, t6)..**.*
1ae80 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  * All the tables
1ae90 20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74   in mPrereq must
1aea0 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
1aeb0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  re the current v
1aec0 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65  irtual .** table
1aed0 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66  . So any terms f
1aee0 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65  or which all pre
1aef0 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73  requisites are s
1af00 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20  atisfied by .** 
1af10 6d 50 72 65 72 65 71 20 6d 61 79 20 62 65 20 73  mPrereq may be s
1af20 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73 61  pecified as "usa
1af30 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c  ble" in all call
1af40 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e  s to xBestIndex.
1af50 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c   .** Conversely,
1af60 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d   all tables in m
1af70 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65  Unusable must be
1af80 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
1af90 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69  he current.** vi
1afa0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20  rtual table, so 
1afb0 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68  any terms for wh
1afc0 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75 69  ich the prerequi
1afd0 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69  sites overlap wi
1afe0 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  th.** mUnusable 
1aff0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1b000 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22   configured as "
1b010 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20  not-usable" for 
1b020 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73  xBestIndex..*/.s
1b030 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1b040 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20  oopAddVirtual(. 
1b050 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1b060 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a  r *pBuilder,  /*
1b070 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
1b080 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
1b090 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20  itmask mPrereq, 
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b0b0 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1b0c0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1b0d0 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  e this one */.  
1b0e0 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
1b0f0 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
1b100 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
1b110 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65   be scanned afte
1b120 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b  r this one */.){
1b130 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b140 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1b150 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1b160 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
1b170 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
1b180 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
1b190 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
1b1a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1c0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1b1d0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
1b1e0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1b1f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1b200 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1b210 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b220 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
1b230 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1b240 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
1b250 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
1b260 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20  _info *p;       
1b270 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73  /* Object to pas
1b280 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  s to xBestIndex(
1b290 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  ) */.  int nCons
1b2a0 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
1b2b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b2c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1b2d0 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20  p */.  int bIn; 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
1b300 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29  lan uses IN(...)
1b310 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57   operator */.  W
1b320 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
1b330 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b    Bitmask mBest;
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b350 2a 20 54 61 62 6c 65 73 20 75 73 65 64 20 62 79  * Tables used by
1b360 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70   best possible p
1b370 6c 61 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lan */..  assert
1b380 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e  ( (mPrereq & mUn
1b390 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
1b3a0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1b3b0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
1b3c0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1b3d0 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42  arse;.  pWC = pB
1b3e0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1b3f0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1b400 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
1b410 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1b420 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1b430 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
1b440 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1b450 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61   );.  p = alloca
1b460 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
1b470 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62  se, pWC, mUnusab
1b480 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  le, pSrc, pBuild
1b490 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
1b4a0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1b4b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
1b4c0 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  BKPT;.  pNew->rS
1b4d0 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
1b4e0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1b4f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
1b500 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1b510 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
1b520 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
1b530 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
1b540 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b   p->nConstraint;
1b550 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
1b560 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
1b570 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72  b, pNew, nConstr
1b580 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  aint) ){.    sql
1b590 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1b5a0 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72  e->db, p);.    r
1b5b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1b5c0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
1b5d0 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42  /* First call xB
1b5e0 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20  estIndex() with 
1b5f0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  all constraints 
1b600 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45  usable. */.  WHE
1b610 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1b620 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c    VirtualOne: al
1b630 6c 20 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20  l usable\n"));. 
1b640 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1b650 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75  ddVirtualOne(pBu
1b660 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1b670 41 4c 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 26  ALLBITS, 0, p, &
1b680 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  bIn);..  /* If t
1b690 68 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74  he call to xBest
1b6a0 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c  Index() with all
1b6b0 20 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70   terms enabled p
1b6c0 72 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20  roduced a plan. 
1b6d0 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
1b6e0 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f  t require any so
1b6f0 75 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f 57  urce tables (IOW
1b700 3a 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d 42  : a plan with mB
1b710 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68  est==0),.  ** th
1b720 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  en there is no p
1b730 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61  oint in making a
1b740 6e 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  ny further calls
1b750 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1b760 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
1b770 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72  y will all retur
1b780 6e 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  n the same resul
1b790 74 20 28 69 66 20 74 68 65 20 78 42 65 73 74 49  t (if the xBestI
1b7a0 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c  ndex().  ** impl
1b7b0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 61  ementation is sa
1b7c0 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ne). */.  if( rc
1b7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
1b7e0 6d 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70  mBest = (pNew->p
1b7f0 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71  rereq & ~mPrereq
1b800 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
1b810 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20   seenZero = 0;  
1b820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b830 75 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74  ue if a plan wit
1b840 68 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65  h no prereqs see
1b850 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65  n */.    int see
1b860 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20  nZeroNoIN = 0;  
1b870 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77         /* Plan w
1b880 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61  ith no prereqs a
1b890 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65  nd no IN(...) se
1b8a0 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73  en */.    Bitmas
1b8b0 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  k mPrev = 0;.   
1b8c0 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f   Bitmask mBestNo
1b8d0 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  In = 0;..    /* 
1b8e0 49 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64  If the plan prod
1b8f0 75 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c  uced by the earl
1b900 69 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e  ier call uses an
1b910 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63   IN(...) term, c
1b920 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74  all.    ** xBest
1b930 49 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69  Index again, thi
1b940 73 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e  s time with IN(.
1b950 2e 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c  ..) terms disabl
1b960 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ed. */.    if( b
1b970 49 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52  In ){.      WHER
1b980 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1b990 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1b9a0 20 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e   usable w/o IN\n
1b9b0 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1b9c0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1b9d0 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1b9e0 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1b9f0 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 26 62 49  S, WO_IN, p, &bI
1ba00 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
1ba10 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ( bIn==0 );.    
1ba20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e    mBestNoIn = pN
1ba30 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50  ew->prereq & ~mP
1ba40 72 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66 28  rereq;.      if(
1ba50 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b   mBestNoIn==0 ){
1ba60 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1ba70 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  o = 1;.        s
1ba80 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1ba90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1baa0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73      /* Call xBes
1bab0 74 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72 20  tIndex once for 
1bac0 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 76 61  each distinct va
1bad0 6c 75 65 20 6f 66 20 28 70 72 65 72 65 71 52 69  lue of (prereqRi
1bae0 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29 20  ght & ~mPrereq) 
1baf0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73  .    ** in the s
1bb00 65 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61 74  et of terms that
1bb10 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63 75   apply to the cu
1bb20 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61  rrent virtual ta
1bb30 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  ble.  */.    whi
1bb40 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1bb50 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
1bb60 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
1bb70 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b  mNext = ALLBITS;
1bb80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1bb90 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  Next>0 );.      
1bba0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1bbb0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
1bbc0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
1bbd0 68 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20  his = (.        
1bbe0 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43      pWC->a[p->aC
1bbf0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
1bc00 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71  rmOffset].prereq
1bc10 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71  Right & ~mPrereq
1bc20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1bc30 20 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d 50      if( mThis>mP
1bc40 72 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65  rev && mThis<mNe
1bc50 78 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68  xt ) mNext = mTh
1bc60 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  is;.      }.    
1bc70 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b    mPrev = mNext;
1bc80 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74  .      if( mNext
1bc90 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65 61  ==ALLBITS ) brea
1bca0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65  k;.      if( mNe
1bcb0 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65  xt==mBest || mNe
1bcc0 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20  xt==mBestNoIn ) 
1bcd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1bce0 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1bcf0 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1bd00 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e   mPrev=%04llx mN
1bd10 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20  ext=%04llx\n",. 
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd30 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75        (sqlite3_u
1bd40 69 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73 71  int64)mPrev, (sq
1bd50 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65  lite3_uint64)mNe
1bd60 78 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  xt));.      rc =
1bd70 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1bd80 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72  tualOne(pBuilder
1bd90 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74  , mPrereq, mNext
1bda0 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20  |mPrereq, 0, p, 
1bdb0 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &bIn);.      if(
1bdc0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d   pNew->prereq==m
1bdd0 50 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  Prereq ){.      
1bde0 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a    seenZero = 1;.
1bdf0 20 20 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d          if( bIn=
1be00 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49  =0 ) seenZeroNoI
1be10 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  N = 1;.      }. 
1be20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1be30 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  the calls to xBe
1be40 73 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65  stIndex() in the
1be50 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20   above loop did 
1be60 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a  not find a plan.
1be70 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75      ** that requ
1be80 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74  ires no source t
1be90 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e  ables at all (i.
1bea0 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65  e. one guarantee
1beb0 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  d to be.    ** u
1bec0 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63  sable), make a c
1bed0 61 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c  all here with al
1bee0 6c 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  l source tables 
1bef0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20  disabled */.    
1bf00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bf10 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30  K && seenZero==0
1bf20 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
1bf30 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1bf40 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64  irtualOne: all d
1bf50 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20  isabled\n"));.  
1bf60 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1bf70 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1bf80 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1bf90 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70  q, mPrereq, 0, p
1bfa0 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69  , &bIn);.      i
1bfb0 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e  f( bIn==0 ) seen
1bfc0 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1bfd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1bfe0 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  he calls to xBes
1bff0 74 49 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f  tIndex() have so
1c000 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66   far failed to f
1c010 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a  ind a plan.    *
1c020 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  * that requires 
1c030 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  no source tables
1c040 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73   at all and does
1c050 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e   not use an IN(.
1c060 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ..).    ** opera
1c070 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61  tor, make a fina
1c080 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e  l call to obtain
1c090 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20   one here.  */. 
1c0a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c0b0 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f  E_OK && seenZero
1c0c0 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIN==0 ){.     
1c0d0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1c0e0 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1c0f0 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61  : all disabled a
1c100 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a  nd w/o IN\n"));.
1c110 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1c120 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1c130 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  e(pBuilder, mPre
1c140 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f  req, mPrereq, WO
1c150 5f 49 4e 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20  _IN, p, &bIn);. 
1c160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c170 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
1c180 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
1c190 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ee(p->idxStr);. 
1c1a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1c1b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20  Parse->db, p);. 
1c1c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1c1d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1c1e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1c1f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57   */../*.** Add W
1c200 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73  hereLoop entries
1c210 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65   to handle OR te
1c220 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  rms.  This works
1c230 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62   for either.** b
1c240 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c  trees or virtual
1c250 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
1c260 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1c270 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f  AddOr(.  WhereLo
1c280 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1c290 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20  der, .  Bitmask 
1c2a0 6d 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d  mPrereq, .  Bitm
1c2b0 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b  ask mUnusable.){
1c2c0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1c2d0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1c2e0 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
1c2f0 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
1c300 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
1c310 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1c320 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
1c330 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c340 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
1c350 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
1c360 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
1c370 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
1c380 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
1c390 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74  sSum, sCur;.  st
1c3a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c3b0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
1c3c0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
1c3d0 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70  WC;.  pWCEnd = p
1c3e0 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
1c3f0 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  rm;.  pNew = pBu
1c400 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d  ilder->pNew;.  m
1c410 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20  emset(&sSum, 0, 
1c420 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20  sizeof(sSum));. 
1c430 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
1c440 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
1c450 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75  New->iTab;.  iCu
1c460 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
1c470 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  or;..  for(pTerm
1c480 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
1c490 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
1c4a0 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
1c4b0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
1c4c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1c4d0 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
1c4e0 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
1c4f0 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
1c500 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
1c510 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
1c520 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
1c530 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
1c540 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
1c550 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
1c560 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
1c570 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
1c580 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
1c590 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1c5a0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
1c5b0 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1c5c0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
1c5d0 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c   .      sSubBuil
1c5e0 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
1c5f0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1c600 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1c610 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
1c620 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
1c630 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1c640 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72  x200, ("Begin pr
1c650 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
1c660 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
1c670 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  );.      for(pOr
1c680 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
1c690 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
1c6a0 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
1c6b0 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
1c6c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1c6d0 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
1c6e0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1c6f0 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
1c700 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
1c710 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c720 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
1c730 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
1c740 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1c750 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
1c760 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
1c770 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
1c780 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
1c790 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
1c7a0 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
1c7b0 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
1c7c0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1c7d0 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
1c7e0 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
1c7f0 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
1c800 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c810 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1c820 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
1c830 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
1c840 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1c850 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
1c860 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1c870 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20  x200, ("OR-term 
1c880 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20  %d of %p has %d 
1c890 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20  subterms:\n", . 
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8b0 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d    (int)(pOrTerm-
1c8c0 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d  pOrWC->a), pTerm
1c8d0 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  , sSubBuild.pWC-
1c8e0 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  >nTerm));.      
1c8f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
1c900 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20  reTrace & 0x400 
1c910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1c920 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50  ite3WhereClauseP
1c930 72 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70  rint(sSubBuild.p
1c940 57 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  WC);.        }.#
1c950 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
1c960 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1c970 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
1c980 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
1c990 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
1c9a0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1c9b0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
1c9c0 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1c9d0 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1c9e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
1c9f0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
1ca00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1ca10 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
1ca20 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1ca30 65 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d  ereq);.        }
1ca40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1ca50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ca60 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1ca70 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75  reLoopAddOr(&sSu
1ca80 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c  bBuild, mPrereq,
1ca90 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1caa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1cab0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1cac0 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d  E_OK || sCur.n==
1cad0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1cae0 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20   sCur.n==0 ){.  
1caf0 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1cb00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
1cb10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1cb20 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  se if( once ){. 
1cb30 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
1cb40 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75  Move(&sSum, &sCu
1cb50 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  r);.          on
1cb60 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
1cb70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1cb80 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65   WhereOrSet sPre
1cb90 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  v;.          whe
1cba0 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c  reOrMove(&sPrev,
1cbb0 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20   &sSum);.       
1cbc0 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
1cbd0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1cbe0 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b  ; i<sPrev.n; i++
1cbf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1cc00 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e  or(j=0; j<sCur.n
1cc10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1cc20 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
1cc30 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76  ert(&sSum, sPrev
1cc40 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73  .a[i].prereq | s
1cc50 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c  Cur.a[j].prereq,
1cc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1cc80 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1cc90 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73  rev.a[i].rRun, s
1cca0 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a  Cur.a[j].rRun),.
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ccd0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1cce0 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43  ev.a[i].nOut, sC
1ccf0 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a  ur.a[j].nOut));.
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1cd10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cd20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cd30 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1cd40 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   1;.      pNew->
1cd50 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
1cd60 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  m;.      pNew->w
1cd70 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
1cd80 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70  ULTI_OR;.      p
1cd90 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1cda0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
1cdb0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  rtIdx = 0;.     
1cdc0 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75   memset(&pNew->u
1cdd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77  , 0, sizeof(pNew
1cde0 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  ->u));.      for
1cdf0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
1ce00 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b  _OK && i<sSum.n;
1ce10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
1ce20 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e  * TUNING: Curren
1ce30 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  tly sSum.a[i].rR
1ce40 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  un is set to the
1ce50 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74   sum of the cost
1ce60 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  s.        ** of 
1ce70 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65  all sub-scans re
1ce80 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
1ce90 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20  -scan. However, 
1cea0 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a  due to rounding.
1ceb0 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72          ** error
1cec0 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61  s, it may be tha
1ced0 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  t the cost of th
1cee0 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75  e OR-scan is equ
1cef0 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20  al to its.      
1cf00 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73    ** most expens
1cf10 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64  ive sub-scan. Ad
1cf20 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70  d the smallest p
1cf30 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20  ossible penalty 
1cf40 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75  .        ** (equ
1cf50 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69  ivalent to multi
1cf60 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20  plying the cost 
1cf70 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75  by 1.07) to ensu
1cf80 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  re that .       
1cf90 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f   ** this does no
1cfa0 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77  t happen. Otherw
1cfb0 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63  ise, for WHERE c
1cfc0 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74  lauses such as t
1cfd0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  he.        ** fo
1cfe0 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68  llowing where th
1cff0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
1d000 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20  on "y":.        
1d010 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
1d020 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f    WHERE likeliho
1d030 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52  od(x=?, 0.99) OR
1d040 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a   y=?.        **.
1d050 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
1d060 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74  lanner may elect
1d070 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65   to "OR" togethe
1d080 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73  r a full-table s
1d090 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  can and an.     
1d0a0 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b     ** index look
1d0b0 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69  up. And other si
1d0c0 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75  milarly odd resu
1d0d0 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  lts.  */.       
1d0e0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53   pNew->rRun = sS
1d0f0 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31  um.a[i].rRun + 1
1d100 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1d110 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  nOut = sSum.a[i]
1d120 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70  .nOut;.        p
1d130 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53  New->prereq = sS
1d140 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a  um.a[i].prereq;.
1d150 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1d160 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1d170 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1d180 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
1d190 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1d1a0 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f  End processing O
1d1b0 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20  R-clause %p\n", 
1d1c0 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20  pTerm));.    }. 
1d1d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
1d1f0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1d200 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
1d210 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
1d220 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
1d230 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
1d240 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
1d250 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1d260 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
1d270 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
1d280 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42  mPrereq = 0;.  B
1d290 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
1d2a0 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
1d2b0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1d2c0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
1d2d0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1d2e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1d2f0 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72  tem;.  struct Sr
1d300 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64  cList_item *pEnd
1d310 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1d320 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b  pWInfo->nLevel];
1d330 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1d340 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
1d350 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
1d360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65  SQLITE_OK;.  Whe
1d370 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1d380 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65  u8 priorJointype
1d390 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70   = 0;..  /* Loop
1d3a0 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73   over the tables
1d3b0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72   in the join, fr
1d3c0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1d3d0 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75   */.  pNew = pBu
1d3e0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77  ilder->pNew;.  w
1d3f0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65  hereLoopInit(pNe
1d400 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  w);.  for(iTab=0
1d410 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
1d420 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b  ->a; pItem<pEnd;
1d430 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
1d440 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  ){.    Bitmask m
1d450 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Unusable = 0;.  
1d460 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
1d470 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
1d480 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65  askSelf = sqlite
1d490 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
1d4a0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1d4b0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1d4c0 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
1d4d0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70  m->fg.jointype|p
1d4e0 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20  riorJointype) & 
1d4f0 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
1d500 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
1d510 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f  /* This conditio
1d520 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70  n is true when p
1d530 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d  Item is the FROM
1d540 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20   clause term on 
1d550 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67  the.      ** rig
1d560 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ht-hand-side of 
1d570 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  a LEFT or CROSS 
1d580 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  JOIN.  */.      
1d590 6d 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72  mPrereq = mPrior
1d5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
1d5b0 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65  rJointype = pIte
1d5c0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  m->fg.jointype;.
1d5d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d5e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1d5f0 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
1d600 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
1d610 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1d620 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b  SrcList_item *p;
1d630 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49  .      for(p=&pI
1d640 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20  tem[1]; p<pEnd; 
1d650 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
1d660 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28  ( mUnusable || (
1d670 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  p->fg.jointype &
1d680 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
1d690 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  SS)) ){.        
1d6a0 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73    mUnusable |= s
1d6b0 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1d6c0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1d6d0 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72  kSet, p->iCursor
1d6e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d6f0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1d700 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1d710 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50  ual(pBuilder, mP
1d720 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65  rereq, mUnusable
1d730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
1d740 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1d750 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1d760 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  */.    {.      r
1d770 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1d780 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20  Btree(pBuilder, 
1d790 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a  mPrereq);.    }.
1d7a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d7b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d7c0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1d7d0 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  Or(pBuilder, mPr
1d7e0 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1d7f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69  ;.    }.    mPri
1d800 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b  or |= pNew->mask
1d810 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63  Self;.    if( rc
1d820 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1d830 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
1d840 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  }..  whereLoopCl
1d850 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ear(db, pNew);. 
1d860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d870 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57  *.** Examine a W
1d880 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74  herePath (with t
1d890 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74  he addition of t
1d8a0 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f  he extra WhereLo
1d8b0 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a  op of the 5th.**
1d8c0 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20   parameters) to 
1d8d0 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74  see if it output
1d8e0 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  s rows in the re
1d8f0 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59  quested ORDER BY
1d900 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59  .** (or GROUP BY
1d910 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72  ) without requir
1d920 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73  ing a separate s
1d930 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ort operation.  
1d940 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a  Return N:.** .**
1d950 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d     N>0:   N term
1d960 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1d970 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74  Y clause are sat
1d980 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30  isfied.**   N==0
1d990 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74  :  No terms of t
1d9a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d9b0 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64  se are satisfied
1d9c0 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b  .**   N<0:   Unk
1d9d0 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e  nown yet how man
1d9e0 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52  y terms of ORDER
1d9f0 20 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74   BY might be sat
1da00 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a  isfied.   .**.**
1da10 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65   Note that proce
1da20 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f  ssing for WHERE_
1da30 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52  GROUPBY and WHER
1da40 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20  E_DISTINCTBY is 
1da50 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74  not as.** strict
1da60 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59  .  With GROUP BY
1da70 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68   and DISTINCT th
1da80 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65  e only requireme
1da90 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71  nt is that.** eq
1daa0 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70  uivalent rows ap
1dab0 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  pear immediately
1dac0 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65   adjacent to one
1dad0 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50   another.  GROUP
1dae0 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49   BY.** and DISTI
1daf0 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  NCT do not requi
1db00 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
1db10 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
1db20 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
1db30 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65  g.** as equivale
1db40 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
1db50 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
1db60 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
1db70 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
1db80 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
1db90 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
1dba0 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
1dbb0 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
1dbc0 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
1dbd0 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
1dbe0 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
1dbf0 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
1dc00 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1dc10 20 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74   i8 wherePathSat
1dc20 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20  isfiesOrderBy(. 
1dc30 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1dc40 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48  fo,    /* The WH
1dc50 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1dc60 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1dc70 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42  By,   /* ORDER B
1dc80 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  Y or GROUP BY or
1dc90 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65   DISTINCT clause
1dca0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57   to check */.  W
1dcb0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
1dcc0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
1dcd0 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a  ePath to check *
1dce0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
1dcf0 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45  gs,       /* WHE
1dd00 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44  RE_GROUPBY or _D
1dd10 49 53 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52  ISTINCTBY or _OR
1dd20 44 45 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20  DERBY_LIMIT */. 
1dd30 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20   u16 nLoop,     
1dd40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dd50 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
1dd60 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
1dd70 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1dd80 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20  ast,     /* Add 
1dd90 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74  this WhereLoop t
1dda0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61  o the end of pPa
1ddb0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
1ddc0 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61   Bitmask *pRevMa
1ddd0 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d  sk     /* OUT: M
1dde0 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ask of WhereLoop
1ddf0 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65  s to run in reve
1de00 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a  rse order */.){.
1de10 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20    u8 revSet;    
1de20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1de30 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20  if rev is known 
1de40 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20  */.  u8 rev;    
1de50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1de60 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64  mposite sort ord
1de70 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64  er */.  u8 revId
1de80 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
1de90 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65   Index sort orde
1dea0 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65  r */.  u8 isOrde
1deb0 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20  rDistinct;   /* 
1dec0 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c  All prior WhereL
1ded0 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64  oops are order-d
1dee0 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20  istinct */.  u8 
1def0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b  distinctColumns;
1df00 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1df10 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55  e loop has UNIQU
1df20 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  E NOT NULL colum
1df30 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74  ns */.  u8 isMat
1df40 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ch;           /*
1df50 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73   iColumn matches
1df60 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   a term of the O
1df70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1df80 2f 0a 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b  /.  u16 eqOpMask
1df90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
1dfa0 6f 77 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70  owed equality op
1dfb0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36  erators */.  u16
1dfc0 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
1dfd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dfe0 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
1dff0 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
1e000 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1e010 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1e020 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
1e030 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1e040 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
1e050 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1e060 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
1e070 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1e080 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
1e090 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1e0a0 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
1e0b0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
1e0c0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
1e0d0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1e0e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1e0f0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1e100 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1e110 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1e120 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
1e130 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
1e140 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
1e150 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
1e160 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1e170 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
1e180 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1e190 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
1e1a0 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
1e1b0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
1e1c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1e1d0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
1e1e0 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
1e1f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1e200 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
1e210 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1e220 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
1e230 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1e240 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
1e250 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
1e260 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
1e270 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
1e280 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1e290 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1e2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1e2b0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1e2c0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
1e2d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1e2e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1e2f0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
1e300 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
1e310 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
1e320 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
1e330 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1e340 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
1e350 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
1e360 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
1e370 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
1e380 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
1e390 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
1e3a0 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
1e3b0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
1e3c0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
1e3d0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e3f0 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
1e400 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
1e410 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
1e420 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
1e430 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
1e440 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
1e450 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
1e460 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
1e470 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
1e480 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1e490 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1e4a0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
1e4b0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
1e4c0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
1e4d0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
1e4e0 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
1e4f0 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
1e500 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
1e510 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
1e520 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
1e530 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
1e540 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
1e550 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
1e560 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
1e570 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1e580 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
1e590 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
1e5a0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
1e5b0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
1e5c0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
1e5d0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
1e5e0 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
1e5f0 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
1e600 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1e610 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
1e620 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
1e630 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
1e640 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
1e650 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1e660 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
1e670 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
1e680 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
1e690 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
1e6a0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
1e6b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1e6c0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
1e6d0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
1e6e0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
1e6f0 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
1e700 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
1e710 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
1e720 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
1e730 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
1e740 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
1e750 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
1e760 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
1e770 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
1e780 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
1e790 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
1e7a0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
1e7b0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
1e7c0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
1e7d0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
1e7e0 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
1e7f0 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
1e800 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
1e810 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
1e820 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
1e830 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
1e840 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
1e850 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1e860 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
1e870 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
1e880 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
1e890 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
1e8a0 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
1e8b0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1e8c0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
1e8d0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
1e8e0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1e8f0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
1e900 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
1e910 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
1e920 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1e930 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
1e940 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
1e950 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
1e960 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
1e970 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
1e980 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
1e990 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
1e9a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1e9b0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
1e9c0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
1e9d0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
1e9e0 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
1e9f0 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71   ready = 0;.  eq
1ea00 4f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c  OpMask = WO_EQ |
1ea10 20 57 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55   WO_IS | WO_ISNU
1ea20 4c 4c 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46  LL;.  if( wctrlF
1ea30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
1ea40 45 52 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f  ERBY_LIMIT ) eqO
1ea50 70 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a  pMask |= WO_IN;.
1ea60 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
1ea70 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26  sOrderDistinct &
1ea80 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26  & obSat<obDone &
1ea90 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20  & iLoop<=nLoop; 
1eaa0 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66  iLoop++){.    if
1eab0 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64  ( iLoop>0 ) read
1eac0 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  y |= pLoop->mask
1ead0 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c  Self;.    if( iL
1eae0 6f 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20  oop<nLoop ){.   
1eaf0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68     pLoop = pPath
1eb00 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
1eb10 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46        if( wctrlF
1eb20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
1eb30 45 52 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e  ERBY_LIMIT ) con
1eb40 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tinue;.    }else
1eb50 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  {.      pLoop = 
1eb60 70 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pLast;.    }.   
1eb70 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1eb80 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1eb90 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
1eba0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76    if( pLoop->u.v
1ebb0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20  tab.isOrdered ) 
1ebc0 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a  obSat = obDone;.
1ebd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ebe0 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57   }.    iCur = pW
1ebf0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1ec00 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
1ec10 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
1ec20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
1ec30 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
1ec40 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
1ec50 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
1ec60 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
1ec70 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
1ec80 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
1ec90 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
1eca0 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
1ecb0 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
1ecc0 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
1ecd0 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
1ece0 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
1ecf0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
1ed00 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
1ed10 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
1ed20 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1ed30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ed40 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
1ed50 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1ed60 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
1ed70 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1ed80 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
1ed90 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
1eda0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1edb0 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
1edc0 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
1edd0 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
1ede0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
1edf0 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e  ndTerm(&pWInfo->
1ee00 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78  sWC, iCur, pOBEx
1ee10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71 4f 70      ~ready, eqOp
1ee40 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  Mask, 0);.      
1ee50 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63  if( pTerm==0 ) c
1ee60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1ee70 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1ee80 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49  ator&(WO_EQ|WO_I
1ee90 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  S))!=0 && pOBExp
1eea0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
1eeb0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1eec0 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20  har *z1, *z2;.  
1eed0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1eee0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1eef0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1ef00 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
1ef10 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1ef20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
1ef30 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
1ef40 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ll;.        z1 =
1ef50 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
1ef60 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
1ef70 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1ef80 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
1ef90 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
1efa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
1efb0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
1efc0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1efd0 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d       z2 = pColl-
1efe0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1eff0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1f000 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20  mp(z1, z2)!=0 ) 
1f010 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f020 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1f030 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
1f040 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _IS );.      }. 
1f050 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
1f060 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
1f070 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
1f080 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1f090 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
1f0a0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
1f0b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1f0c0 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
1f0d0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
1f0e0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
1f0f0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
1f100 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
1f110 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
1f120 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1f130 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
1f140 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
1f150 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1f160 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1f170 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
1f180 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
1f190 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
1f1a0 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
1f1b0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
1f1c0 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
1f1d0 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
1f1e0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
1f1f0 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
1f200 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1f210 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
1f220 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a  mn-1]==XN_ROWID.
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61            || !Ha
1f250 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
1f260 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  Table));.       
1f270 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1f280 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78   = IsUniqueIndex
1f290 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
1f2a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
1f2b0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
1f2c0 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
1f2d0 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
1f2e0 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
1f2f0 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
1f300 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
1f310 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
1f320 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
1f330 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
1f340 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
1f350 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
1f360 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  0; j<nColumn; j+
1f370 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  +){.        u8 b
1f380 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65 20  Once;   /* True 
1f390 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52  to run the ORDER
1f3a0 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20   BY search loop 
1f3b0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  */..        /* S
1f3c0 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20  kip over == and 
1f3d0 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65  IS and ISNULL te
1f3e0 72 6d 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  rms..        ** 
1f3f0 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74 65  (Also skip IN te
1f400 72 6d 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 57  rms when doing W
1f410 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
1f420 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 0a 20  IT processing). 
1f430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f440 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
1f450 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
1f460 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53      && pLoop->nS
1f470 6b 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  kip==0.         
1f480 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e  && ((i = pLoop->
1f490 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
1f4a0 61 74 6f 72 29 20 26 20 65 71 4f 70 4d 61 73 6b  ator) & eqOpMask
1f4b0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
1f4c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20            if( i 
1f4d0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
1f4e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1f4f0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
1f500 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
1f510 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1f520 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
1f530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
1f540 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
1f550 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1f560 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   Get the column 
1f570 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61  number in the ta
1f580 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e  ble (iColumn) an
1f590 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20  d sort order.   
1f5a0 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29       ** (revIdx)
1f5b0 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f   for the j-th co
1f5c0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1f5d0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x..        */.  
1f5e0 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
1f5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43   ){.          iC
1f600 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
1f610 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1f620 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1f630 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1f640 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
1f650 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
1f660 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
1f670 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
1f680 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1f690 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  e{.          iCo
1f6a0 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  lumn = XN_ROWID;
1f6b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
1f6c0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
1f6d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ..        /* An 
1f6e0 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f  unconstrained co
1f6f0 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20  lumn that might 
1f700 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68  be NULL means th
1f710 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
1f720 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ** WhereLoop is 
1f730 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  not well-ordered
1f740 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1f750 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
1f760 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
1f770 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
1f780 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
1f790 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1f7a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
1f7b0 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
1f7c0 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
1f7d0 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
1f7e0 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
1f7f0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
1f800 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f810 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
1f820 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
1f830 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1f840 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1f850 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1f860 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72  he index and mar
1f870 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
1f880 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
1f890 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e    */.        bOn
1f8a0 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
1f8b0 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
1f8c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f       for(i=0; bO
1f8d0 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42  nce && i<nOrderB
1f8e0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
1f8f0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1f900 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1f910 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1f920 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
1f930 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1f940 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
1f950 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1f960 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
1f970 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
1f980 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20  ROUPBY );.      
1f990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
1f9a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1f9b0 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20  _DISTINCTBY );. 
1f9c0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
1f9d0 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52  trlFlags & (WHER
1f9e0 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f  E_GROUPBY|WHERE_
1f9f0 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20  DISTINCTBY))==0 
1fa00 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ) bOnce = 0;.   
1fa10 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
1fa20 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  mn>=(-1) ){.    
1fa30 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
1fa40 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1fa50 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
1fa60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1fa70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
1fa80 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
1fa90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1faa0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
1fab0 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
1fac0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1fad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fae0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1faf0 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 42 45 78  xprCompare(pOBEx
1fb00 70 72 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  pr,pIndex->aColE
1fb10 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  xpr->a[j].pExpr,
1fb20 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20  iCur) ){.       
1fb30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1fb40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1fb50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fb60 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
1fb70 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1fb80 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1fb90 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
1fba0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
1fbb0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1fbc0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1fbd0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
1fbe0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
1fbf0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
1fc00 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1fc10 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
1fc20 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
1fc30 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
1fc40 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1fc50 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63            isMatc
1fc60 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
1fc70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1fc80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
1fc90 4d 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46  Match && (wctrlF
1fca0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
1fcb0 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
1fcc0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
1fcd0 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  re the sort orde
1fce0 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  r is compatible 
1fcf0 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
1fd00 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20  lause..         
1fd10 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
1fd20 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
1fd30 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
1fd40 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1fd50 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
1fd60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1fd70 72 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70  rev ^ revIdx)!=p
1fd80 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1fd90 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63  rtOrder ) isMatc
1fda0 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
1fdb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fdc0 20 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78      rev = revIdx
1fdd0 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   ^ pOrderBy->a[i
1fde0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
1fdf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
1fe00 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
1fe10 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53              revS
1fe30 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
1fe40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1fe50 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1fe60 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  h ){.          i
1fe70 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1fe90 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
1fea0 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
1feb0 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
1fec0 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
1fed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fee0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
1fef0 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
1ff00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ff10 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
1ff20 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
1ff30 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
1ff40 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
1ff50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1ff60 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
1ff70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
1ff80 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1ff90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ffa0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
1ffb0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1ffc0 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
1ffd0 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
1ffe0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
1fff0 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
20000 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
20010 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
20020 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
20030 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
20040 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
20050 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
20060 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
20070 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
20080 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
20090 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
200a0 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
200b0 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
200c0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
200d0 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
200e0 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
200f0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
20100 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
20110 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
20120 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
20130 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
20140 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
20150 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
20160 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
20170 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
20180 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
20190 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
201a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
201b0 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
201c0 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
201d0 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
201e0 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
201f0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
20200 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20210 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
20220 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
20230 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
20240 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
20250 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
20260 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20270 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
20280 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
20290 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
202a0 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
202b0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
202c0 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
202d0 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
202e0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
202f0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
20300 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
20310 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
20320 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
20330 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
20340 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
20350 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
20360 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
20370 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20380 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
20390 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
203a0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
203b0 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
203c0 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
203d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
203e0 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
203f0 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
20400 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
20410 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
20420 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
20430 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
20440 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
20450 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
20460 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
20470 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
20480 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
20490 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
204a0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
204b0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
204c0 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
204d0 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
204e0 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
204f0 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
20500 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
20510 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
20520 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
20530 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
20540 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
20550 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
20560 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
20570 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
20580 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
20590 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
205a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
205b0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
205c0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
205d0 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
205e0 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
205f0 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
20600 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
20610 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
20620 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
20630 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
20640 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
20650 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
20660 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
20670 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
20680 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
20690 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
206a0 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
206b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
206c0 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
206d0 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
206e0 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
206f0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
20700 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
20710 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
20720 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
20730 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
20740 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
20750 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
20760 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
20770 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
20780 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
20790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
207a0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
207b0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
207c0 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
207d0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
207e0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
207f0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
20800 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
20810 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
20820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
20830 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
20840 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
20850 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
20860 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
20870 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
20880 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
20890 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
208a0 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
208b0 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
208c0 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
208d0 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
208e0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
208f0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
20900 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
20910 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20920 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
20930 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
20940 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
20950 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
20960 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
20970 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
20980 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
20990 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
209a0 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
209b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
209c0 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
209d0 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
209e0 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
209f0 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
20a00 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
20a10 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
20a20 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
20a30 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
20a40 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
20a50 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
20a60 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
20a70 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
20a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
20a90 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
20aa0 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
20ab0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
20ac0 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
20ad0 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
20ae0 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
20af0 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
20b00 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
20b10 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
20b20 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
20b30 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
20b40 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
20b50 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
20b60 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
20b70 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
20b80 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
20b90 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
20ba0 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
20bb0 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
20bc0 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
20bd0 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
20be0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
20bf0 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
20c00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
20c10 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
20c20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
20c30 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
20c40 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
20c50 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
20c60 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c  t = nRow + rScal
20c70 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75  e + 16;..  /* Mu
20c80 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29  ltiple by log(M)
20c90 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20   where M is the 
20ca0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
20cb0 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20   rows..  ** Use 
20cc0 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20  the LIMIT for M 
20cd0 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  if it is smaller
20ce0 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66   */.  if( (pWInf
20cf0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
20d00 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
20d10 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69  !=0 && pWInfo->i
20d20 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20  Limit<nRow ){.  
20d30 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d    nRow = pWInfo-
20d40 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  >iLimit;.  }.  r
20d50 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c  SortCost += estL
20d60 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75  og(nRow);.  retu
20d70 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
20d80 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
20d90 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
20da0 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
20db0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
20dc0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
20dd0 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
20de0 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
20df0 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
20e00 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
20e10 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
20e20 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
20e30 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
20e40 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
20e50 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
20e60 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
20e70 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
20e80 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
20e90 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
20ea0 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
20eb0 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
20ec0 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
20ed0 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
20ee0 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
20ef0 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
20f00 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
20f10 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
20f20 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
20f30 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
20f40 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
20f50 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
20f60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
20f70 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
20f80 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
20f90 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
20fa0 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
20fc0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
20fd0 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
20fe0 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
20ff0 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
21000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21010 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
21020 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
21030 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
21040 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
21050 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
21060 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
21070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21080 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
21090 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
210a0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
210b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
210c0 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
210d0 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
210e0 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21100 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
21110 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
21120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21130 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
21140 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
21150 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
21160 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
21170 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
21180 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
21190 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
211a0 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
211b0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
211c0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
211d0 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
211e0 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
211f0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
21200 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
21210 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
21220 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
21230 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
21240 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
21250 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
21260 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
21270 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
21280 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
21290 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
212a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
212b0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
212c0 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
212d0 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
212e0 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
212f0 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
21300 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
21310 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
21320 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
21330 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
21340 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
21350 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
21360 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
21370 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
21380 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
21390 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
213a0 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
213b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
213c0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
213d0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
213e0 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
213f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
21400 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
21410 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
21420 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
21430 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
21440 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
21450 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
21460 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
21470 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
21480 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
21490 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
214a0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
214b0 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
214c0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
214d0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
214e0 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
214f0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
21500 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
21510 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21520 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
21530 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
21540 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
21550 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
21560 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
21570 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
21580 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
21590 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
215a0 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
215b0 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
215c0 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
215d0 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
215e0 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
215f0 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
21600 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
21610 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
21620 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
21630 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
21640 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
21650 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
21660 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
21670 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
21680 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
21690 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
216a0 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
216b0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
216c0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
216d0 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
216e0 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
216f0 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
21700 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
21710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
21720 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
21730 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
21740 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
21750 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
21760 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
21770 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
21780 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
21790 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
217a0 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
217b0 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
217c0 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
217d0 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
217e0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
217f0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
21800 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
21810 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
21820 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
21830 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
21840 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
21850 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
21860 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
21870 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
21880 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
21890 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
218a0 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
218b0 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
218c0 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
218d0 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
218e0 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
218f0 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
21900 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
21910 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
21920 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  N(db, nSpace);. 
21930 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
21940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
21950 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f  OMEM_BKPT;.  aTo
21960 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
21970 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
21980 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
21990 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
219a0 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
219b0 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
219c0 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
219d0 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
219e0 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
219f0 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
21a00 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
21a10 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
21a20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
21a30 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
21a40 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
21a50 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
21a60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
21a70 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
21a80 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
21a90 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
21aa0 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
21ab0 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
21ac0 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
21ad0 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
21ae0 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
21af0 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
21b00 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
21b10 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
21b20 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
21b30 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
21b40 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
21b50 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
21b60 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
21b70 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
21b80 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
21b90 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
21ba0 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
21bb0 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
21bc0 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
21bd0 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
21be0 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
21bf0 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
21c00 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
21c10 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
21c20 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
21c30 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
21c40 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
21c50 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
21c60 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
21c70 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
21c80 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
21c90 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
21ca0 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
21cb0 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
21cc0 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
21cd0 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
21ce0 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
21cf0 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
21d00 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
21d10 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
21d20 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20  s go above 28.  
21d30 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
21d40 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
21d50 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
21d60 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
21d70 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
21d80 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 28.  ** rows,
21d90 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
21da0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
21db0 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
21dc0 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
21dd0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
21de0 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28  p, 48);  assert(
21df0 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   48==sqlite3LogE
21e00 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f  st(28) );.  nFro
21e10 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
21e20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
21e30 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
21e40 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
21e50 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
21e60 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
21e70 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
21e80 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
21e90 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
21ea0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
21eb0 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
21ec0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
21ed0 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
21ee0 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
21ef0 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
21f00 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
21f10 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
21f20 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
21f30 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
21f40 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
21f50 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
21f60 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
21f70 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
21f80 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
21f90 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
21fa0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
21fb0 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
21fc0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
21fd0 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
21fe0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
21ff0 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
22000 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
22010 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
22020 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
22030 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
22040 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
22050 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
22060 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
22070 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
22080 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
22090 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
220a0 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
220b0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
220c0 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
220d0 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
220e0 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
220f0 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
22100 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
22110 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
22120 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
22130 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
22140 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
22150 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
22160 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
22170 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
22180 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
22190 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
221a0 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
221c0 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
221d0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
221e0 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
221f0 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
22200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22210 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
22220 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
22230 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
22240 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
22250 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
22260 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
22270 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
22280 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
22290 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
222a0 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
222b0 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
222c0 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
222d0 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
222e0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
222f0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
22300 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
22310 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
22320 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
22330 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22340 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
22350 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
22360 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
22370 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
22380 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
22390 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
223a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
223b0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
223c0 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
223d0 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
223e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
223f0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46  if( (pWLoop->wsF
22400 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
22410 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
22420 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b  From->nRow<10 ){
22430 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
22440 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f   not use an auto
22450 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74  matic index if t
22460 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  he this loop is 
22470 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20  expected.       
22480 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73     ** to run les
22490 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20  s than 2 times. 
224a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
224b0 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
224c0 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
224d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
224e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
224f0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
22500 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
22510 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
22520 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
22530 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
22540 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
22550 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
22560 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
22570 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
22580 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
22590 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
225a0 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
225b0 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
225c0 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
225d0 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65   pFrom->rUnsorte
225e0 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  d);.        nOut
225f0 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
22600 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
22610 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
22620 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
22630 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
22640 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
22650 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a   isOrdered<0 ){.
22660 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
22670 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53  red = wherePathS
22680 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
22690 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
226b0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
226c0 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
226d0 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
22700 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  , &revMask);.   
22710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22720 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
22730 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
22740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22750 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e    if( isOrdered>
22760 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c  =0 && isOrdered<
22770 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
22780 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43        if( aSortC
22790 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d  ost[isOrdered]==
227a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
227b0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
227c0 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72  ered] = whereSor
227d0 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20  tingCost(.      
227e0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
227f0 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65  , nRowEst, nOrde
22800 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20  rBy, isOrdered. 
22810 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
22820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22830 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
22840 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
22850 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73  sorted, aSortCos
22860 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a  t[isOrdered]);..
22870 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
22880 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20  RACE(0x002,.    
22890 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d            ("----
228a0 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20   sort cost=%-3d 
228b0 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65  (%d/%d) increase
228c0 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d  s cost %3d to %-
228d0 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3d\n",.         
228e0 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
228f0 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72  isOrdered], (nOr
22900 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29  derBy-isOrdered)
22910 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  , nOrderBy, .   
22920 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73              rUns
22930 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a  orted, rCost));.
22940 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22950 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
22960 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
22970 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
22980 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
22990 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
229a0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
229b0 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  set of.        *
229c0 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d  * mxChoice best-
229d0 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20  so-far paths..  
229e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
229f0 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66   ** First look f
22a00 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  or an existing p
22a10 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73  ath among best-s
22a20 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20  o-far paths.    
22a30 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65      ** that cove
22a40 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  rs the same set 
22a50 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
22a60 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
22a70 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  red.        ** s
22a80 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75  etting as the cu
22a90 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69  rrent path candi
22aa0 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  date..        **
22ab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
22ac0 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f  term "((pTo->isO
22ad0 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
22ae0 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65  )&0x80)==0" is e
22af0 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
22b00 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73    ** to (pTo->is
22b10 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d  Ordered==(-1))==
22b20 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  (isOrdered==(-1)
22b30 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  )" for the range
22b40 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c  .        ** of l
22b50 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  egal values for 
22b60 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36  isOrdered, -1..6
22b70 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  4..        */.  
22b80 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
22b90 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
22ba0 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
22bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
22bc0 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
22bd0 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
22be0 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
22bf0 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
22c00 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  80)==0.         
22c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22c20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
22c30 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
22c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22c50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22c60 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
22c70 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
22c80 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20   /* None of the 
22c90 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f  existing best-so
22ca0 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68  -far paths match
22cb0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
22cc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
22cd0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20   nTo>=mxChoice. 
22ce0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43            && (rC
22cf0 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72  ost>mxCost || (r
22d00 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
22d10 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73  rUnsorted>=mxUns
22d20 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20  orted)).        
22d30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22d40 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
22d50 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20  candidate is no 
22d60 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20  better than any 
22d70 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
22d80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
22d90 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69  aths currently i
22da0 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61  n the best-so-fa
22db0 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69  r buffer.  So di
22dc0 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20  scard.          
22dd0 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64    ** this candid
22de0 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c  ate as not viabl
22df0 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
22e00 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
22e10 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
22e20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22e30 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
22e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22e50 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22e60 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
22e70 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
22e80 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
22e90 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
22ea0 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
22eb0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
22ec0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
22ef0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
22f00 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
22f10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
22f20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22f30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22f40 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
22f50 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73  each this points
22f60 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
22f70 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65  he new candidate
22f80 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
22f90 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  ** needs to be a
22fa0 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
22fb0 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  of best-so-far p
22fc0 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aths. */.       
22fd0 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
22fe0 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
22ff0 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
23000 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
23010 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
23020 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
23030 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
23040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23050 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
23060 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
23070 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
23080 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
23090 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
230a0 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
230b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
230c0 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
230d0 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
230e0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
230f0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
23100 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23110 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
23120 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
23130 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23140 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
23150 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
23160 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
23170 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
23180 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
23190 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
231a0 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
231b0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
231c0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
231d0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
231e0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
231f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
23210 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
23220 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  e if best-so-far
23230 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a   path pTo=aTo[jj
23240 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20  ] covers the.   
23250 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73         ** same s
23260 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
23270 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72  has the sam isOr
23280 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73  dered setting as
23290 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
232a0 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  * candidate path
232b0 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
232c0 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
232d0 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a   should replace.
232e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
232f0 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69   or if the candi
23300 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73  date should be s
23310 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20  kipped */.      
23320 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
23330 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f  st<rCost || (pTo
23340 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26  ->rCost==rCost &
23350 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
23360 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  t) ){.#ifdef WHE
23370 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
23380 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
23390 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
233a0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
233b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
233c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
233d0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
233e0 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
233f0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
23400 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
23420 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
23430 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
23440 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
23470 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
23480 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
23490 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
234a0 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
234b0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72   cost=%-3d,%d or
234c0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
234e0 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
234f0 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
23500 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
23510 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
23520 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
23530 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
23540 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
23550 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
23560 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
23570 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64        /* Discard
23580 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
23590 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72  ath from further
235a0 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
235b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  /.            te
235c0 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
235d0 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
235e0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
235f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
23600 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
23610 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
23620 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
23630 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
23640 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74  eaches here if t
23650 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
23660 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  h is better than
23670 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
23680 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70  * pTo path.  Rep
23690 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68  lace pTo with th
236a0 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
236b0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
236c0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
236d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
236e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
236f0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
23700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23710 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
23720 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
23730 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
23740 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
23760 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
23770 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
23780 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
23790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
237a0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
237b0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
237c0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
237d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
237e0 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
237f0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
23800 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
23810 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
23820 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
23830 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
23840 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
23850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23860 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
23870 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
23880 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
23890 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
238a0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
238b0 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
238c0 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
238d0 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
238e0 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
238f0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
23900 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
23910 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
23920 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
23930 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
23940 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
23950 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
23960 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
23970 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
23980 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
23990 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73  rUnsorted = rUns
239a0 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70  orted;.        p
239b0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
239c0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
239d0 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
239e0 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
239f0 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
23a00 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
23a10 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
23a20 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
23a30 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
23a40 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
23a50 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
23a60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
23a70 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
23a80 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
23a90 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30  Unsorted = aTo[0
23aa0 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ].nRow;.        
23ab0 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
23ac0 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
23ad0 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
23ae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
23af0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
23b00 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  xCost .         
23b10 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
23b20 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
23b30 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55  o->rUnsorted>mxU
23b40 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20  nsorted) .      
23b50 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
23b60 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
23b70 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
23b80 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
23b90 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73  rted = pTo->rUns
23ba0 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
23bb0 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
23bc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23be0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
23bf0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
23c00 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
23c10 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
23c20 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
23c30 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20   & 0x02 ){.     
23c40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23c50 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
23c60 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
23c70 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
23c80 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
23c90 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
23ca0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
23cb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23cc0 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
23cd0 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
23ce0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
23cf0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
23d00 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
23d10 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
23d20 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
23d30 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
23d40 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
23d50 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
23d60 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
23d70 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
23d80 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
23d90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23da0 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
23db0 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
23dc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
23dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23de0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23df0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
23e00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
23e10 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
23e20 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
23e30 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
23e40 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
23e50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
23e60 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
23e70 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
23e80 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
23e90 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
23ea0 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
23eb0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
23ec0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23ed0 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
23ee0 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
23ef0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
23f00 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
23f10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
23f20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
23f30 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
23f40 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
23f50 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
23f60 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
23f70 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
23f80 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
23f90 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
23fa0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
23fb0 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
23fc0 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
23fd0 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
23fe0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
23ff0 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
24000 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
24010 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
24020 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
24030 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
24040 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
24050 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
24060 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
24070 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
24080 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
24090 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
240a0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
240b0 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
240c0 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
240d0 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
240e0 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
240f0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
24100 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
24110 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
24120 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
24130 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
24140 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
24150 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
24160 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
24170 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
24180 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
24190 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
241a0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
241b0 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
241c0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
241d0 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
241e0 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
241f0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
24200 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
24210 44 69 73 74 69 6e 63 74 53 65 74 2c 20 70 46 72  DistinctSet, pFr
24220 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
24230 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
24240 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
24250 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
24260 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
24270 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
24280 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53  Info->pDistinctS
24290 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
242a0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
242b0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
242c0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
242d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
242e0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
242f0 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
24300 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
24310 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
24320 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
24330 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
24340 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
24350 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
24360 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
24370 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
24380 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
24390 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
243a0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
243b0 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
243c0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
243d0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
243e0 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
243f0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  p;.      if( pWI
24400 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29  nfo->nOBSat<=0 )
24410 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
24420 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20  ->nOBSat = 0;.  
24430 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e        if( nLoop>
24440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42  0 ){.          B
24450 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20  itmask m;.      
24460 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65      int rc = whe
24470 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
24480 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70  rderBy(pWInfo, p
24490 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
244a0 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
244c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
244d0 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  T, nLoop-1, pFro
244e0 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
244f0 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20 20 20  ], &m);.        
24500 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f    if( rc==pWInfo
24510 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
24520 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
24530 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65   pWInfo->bOrdere
24540 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a  dInnerLoop = 1;.
24550 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
24560 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b  fo->revMask = m;
24570 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24590 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57     }.    if( (pW
245a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
245b0 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
245c0 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26 26  ROUP).        &&
245d0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d   pWInfo->nOBSat=
245e0 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
245f0 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f  y->nExpr && nLoo
24600 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  p>0.    ){.     
24610 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
24620 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
24630 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65 50 61  nOrder = wherePa
24640 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
24650 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
24660 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20  o->pOrderBy, .  
24670 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30          pFrom, 0
24680 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
24690 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
246a0 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20  , &revMask.     
246b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
246c0 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64  ( pWInfo->sorted
246d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
246e0 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d   nOrder==pWInfo-
246f0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
24700 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
24710 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a  fo->sorted = 1;.
24720 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
24730 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73  revMask = revMas
24740 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
24750 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d  .  }...  pWInfo-
24760 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d  >nRowOut = pFrom
24770 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72  ->nRow;..  /* Fr
24780 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d  ee temporary mem
24790 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73  ory and return s
247a0 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  uccess */.  sqli
247b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
247c0 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  pace);.  return 
247d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
247e0 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73  .** Most queries
247f0 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67   use only a sing
24800 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20 61  le table (they a
24810 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e  re not joins) an
24820 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65  d have.** simple
24830 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
24840 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20  against indexed 
24850 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f  fields.  This ro
24860 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a  utine attempts.*
24870 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20  * to plan those 
24880 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69  simple cases usi
24890 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72  ng much less cer
248a0 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a  emony than the.*
248b0 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
248c0 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c  e query planner,
248d0 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69 65   and thereby yie
248e0 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74 65  ld faster sqlite
248f0 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74  3_prepare().** t
24900 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  imes for the com
24910 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  mon case..**.** 
24920 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
24930 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20 74  on success, if t
24940 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
24950 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
24960 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75  .** no-frills qu
24970 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65  ery planner.  Re
24980 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69  turn zero if thi
24990 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74 68  s query needs th
249a0 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  e .** general-pu
249b0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
249c0 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ner..*/.static i
249d0 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  nt whereShortCut
249e0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
249f0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
24a00 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
24a10 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  o;.  struct SrcL
24a20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
24a30 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
24a40 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  pWC;.  WhereTerm
24a50 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65   *pTerm;.  Where
24a60 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69  Loop *pLoop;.  i
24a70 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a  nt iCur;.  int j
24a80 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
24a90 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
24aa0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
24ab0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
24ac0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
24ad0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
24ae0 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20 72 65  R_SUBCLAUSE ) re
24af0 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
24b00 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  ( pWInfo->pTabLi
24b10 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20  st->nSrc>=1 );. 
24b20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
24b30 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20  >pTabList->a;.  
24b40 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
24b50 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74  ab;.  if( IsVirt
24b60 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
24b70 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65  rn 0;.  if( pIte
24b80 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
24b90 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
24ba0 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
24bb0 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
24bc0 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
24bd0 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
24be0 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
24bf0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
24c00 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  Loop->nSkip = 0;
24c10 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74  .  pTerm = sqlit
24c20 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
24c30 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
24c40 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30  , WO_EQ|WO_IS, 0
24c50 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
24c60 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
24c70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
24c80 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
24c90 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
24ca0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
24cb0 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
24cc0 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
24cd0 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
24ce0 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
24cf0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
24d00 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
24d10 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
24d20 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
24d30 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
24d40 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
24d50 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
24d60 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 33==sqlite3Lo
24d70 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65  gEst(10) */.  }e
24d80 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
24d90 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
24da0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
24db0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
24dc0 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20  nt opMask;.     
24dd0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
24de0 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f  aLTermSpace==pLo
24df0 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20  op->aLTerm );.  
24e00 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75      if( !IsUniqu
24e10 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20  eIndex(pIdx).   
24e20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61      || pIdx->pPa
24e30 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20  rtIdxWhere!=0 . 
24e40 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e        || pIdx->n
24e50 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65  KeyCol>ArraySize
24e60 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
24e70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f  ace) .      ) co
24e80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70  ntinue;.      op
24e90 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69  Mask = pIdx->uni
24ea0 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45  qNotNull ? (WO_E
24eb0 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51  Q|WO_IS) : WO_EQ
24ec0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
24ed0 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
24ee0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
24ef0 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
24f00 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
24f10 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70  , iCur, j, 0, op
24f20 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20  Mask, pIdx);.   
24f30 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
24f40 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
24f50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
24f60 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
24f70 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
24f80 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
24f90 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
24fa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d   }.      if( j!=
24fb0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  pIdx->nKeyCol ) 
24fc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24fd0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
24fe0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
24ff0 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48  |WHERE_ONEROW|WH
25000 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
25010 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43     if( pIdx->isC
25020 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65  overing || (pIte
25030 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  m->colUsed & ~co
25040 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64  lumnsInIndex(pId
25050 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x))==0 ){.      
25060 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
25070 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
25080 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
25090 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
250a0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
250b0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
250c0 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
250d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
250e0 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20   pIdx;.      /* 
250f0 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
25100 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c  a unique index l
25110 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20  ookup is 15 */. 
25120 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e       pLoop->rRun
25130 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73   = 39;  /* 39==s
25140 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29  qlite3LogEst(15)
25150 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
25160 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
25170 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
25180 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
25190 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a  ut = (LogEst)1;.
251a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
251b0 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b  .pWLoop = pLoop;
251c0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
251d0 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68  Self = sqlite3Wh
251e0 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
251f0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
25200 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ur);.    pWInfo-
25210 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
25220 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
25230 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
25240 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
25250 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
25260 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e  ->nOBSat =  pWIn
25270 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
25280 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  xpr;.    if( pWI
25290 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
252a0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
252b0 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
252c0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
252d0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
252e0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
252f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25300 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
25310 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
25320 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
25330 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
25340 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
25350 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
25360 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
25370 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
25380 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
25390 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
253a0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
253b0 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
253c0 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
253d0 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
253e0 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
253f0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
25400 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
25410 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
25420 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
25430 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
25440 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
25450 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
25460 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
25470 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
25480 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
25490 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
254a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
254b0 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
254c0 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
254d0 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
254e0 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
254f0 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
25500 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
25510 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
25520 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
25530 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
25540 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
25550 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
25560 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
25570 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
25580 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
25590 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
255a0 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
255b0 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
255c0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
255d0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
255e0 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
255f0 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
25600 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
25610 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
25620 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
25630 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
25640 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
25650 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
25660 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
25670 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
25680 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
25690 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
256a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
256b0 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
256c0 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
256d0 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
256e0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
256f0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
25710 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
25720 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25740 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
25750 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
25760 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25780 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
25790 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
257a0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
257b0 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
257c0 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
257d0 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
257e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
257f0 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
25800 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
25810 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
25820 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
25830 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
25840 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
25850 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
25860 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
25870 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
25880 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
25890 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
258a0 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
258b0 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
258c0 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
258d0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
258e0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
258f0 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
25900 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
25910 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
25920 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
25930 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
25940 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
25950 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
25960 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
25970 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
25980 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
25990 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
259a0 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
259b0 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
259c0 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
259d0 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
259e0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
259f0 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
25a00 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
25a10 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
25a20 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
25a30 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
25a40 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
25a50 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
25a60 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
25a70 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
25a80 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
25a90 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
25aa0 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
25ab0 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
25ac0 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
25ad0 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
25ae0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
25af0 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
25b00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
25b10 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
25b20 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
25b30 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
25b40 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
25b50 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
25b60 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
25b70 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
25b80 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
25b90 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
25ba0 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
25bb0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
25bc0 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
25bd0 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
25be0 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
25bf0 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
25c00 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
25c10 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
25c20 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
25c30 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
25c40 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
25c50 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
25c60 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
25c70 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
25c80 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
25c90 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
25ca0 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
25cb0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
25cc0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
25cd0 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
25ce0 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
25cf0 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
25d00 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
25d10 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
25d20 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
25d30 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
25d40 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
25d50 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
25d60 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
25d70 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
25d80 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
25d90 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
25da0 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
25db0 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
25dc0 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
25dd0 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
25de0 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
25df0 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
25e00 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
25e10 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
25e20 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
25e30 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
25e40 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
25e50 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
25e60 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
25e70 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
25e80 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
25e90 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
25ea0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
25eb0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
25ec0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
25ed0 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
25ee0 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
25ef0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
25f00 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
25f10 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
25f20 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
25f30 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
25f40 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
25f50 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
25f60 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
25f70 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
25f80 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
25f90 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
25fa0 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
25fb0 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
25fc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25fd0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
25fe0 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
25ff0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
26000 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
26010 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
26020 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
26030 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
26040 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
26050 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
26060 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
26070 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
26080 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
26090 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
260a0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
260b0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
260c0 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
260d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
260e0 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
260f0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
26100 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
26110 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   If .** WHERE_OR
26120 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
26130 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68  t, iIdxCur is th
26140 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
26150 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74  of an index.** t
26160 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61  o use for OR cla
26170 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
26180 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26190 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69  e should use thi
261a0 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75  s.** specific cu
261b0 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f  rsor.  If WHERE_
261c0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
261d0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64  is set, then iId
261e0 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66  xCur is.** the f
261f0 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61  irst cursor in a
26200 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f  n array of curso
26210 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63  rs for all indic
26220 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f  es.  iIdxCur sho
26230 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  uld.** be used t
26240 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70  o compute the ap
26250 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72  propriate cursor
26260 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
26270 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20  ich index is.** 
26280 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  used..*/.WhereIn
26290 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
262a0 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
262b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
262c0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
262d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
262e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
262f0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
26300 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c  se: A list of al
26310 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
26320 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
26330 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
26340 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
26350 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
26360 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
26370 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52       /* An ORDER
26380 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
26390 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  ) clause, or NUL
263a0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
263b0 2a 70 44 69 73 74 69 6e 63 74 53 65 74 2c 20 2f  *pDistinctSet, /
263c0 2a 20 54 72 79 20 6e 6f 74 20 74 6f 20 6f 75 74  * Try not to out
263d0 70 75 74 20 74 77 6f 20 72 6f 77 73 20 74 68 61  put two rows tha
263e0 74 20 64 75 70 6c 69 63 61 74 65 20 74 68 65 73  t duplicate thes
263f0 65 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  e */.  u16 wctrl
26400 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
26410 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  * The WHERE_* fl
26420 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
26430 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
26440 69 6e 74 20 69 41 75 78 41 72 67 20 20 20 20 20  int iAuxArg     
26450 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
26460 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
26470 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63   is set, index c
26480 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45         ** If WHE
264b0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68  RE_USE_LIMIT, th
264c0 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f  en the limit amo
264d0 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  unt */.){.  int 
264e0 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20  nByteWInfo;     
264f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62         /* Num. b
26500 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
26510 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  or WhereInfo str
26520 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61  uct */.  int nTa
26530 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
26540 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26550 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61   elements in pTa
26560 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
26570 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
26580 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
26590 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
265a0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
265b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
265c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
265d0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
265e0 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
265f0 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
26600 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
26610 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
26620 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
26630 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
26640 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
26650 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20  er sWLB;     /* 
26660 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75  The WhereLoop bu
26670 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  ilder */.  Where
26680 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
26690 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
266a0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
266b0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
266c0 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
266d0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
266e0 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b  el in pWInfo->a[
266f0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
26700 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
26710 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
26720 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f  a single WhereLo
26730 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
26740 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
26750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
26760 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
26770 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
26780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
26790 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
267a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
267d0 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65  */.  u8 bFordele
267e0 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
267f0 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  /* OPFLAG_FORDEL
26800 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20  ETE or zero, as 
26810 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a  appropriate */..
26820 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
26830 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
26840 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d  EPASS_MULTIROW)=
26850 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20  =0 || (.        
26860 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
26870 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
26880 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26  RED)!=0 .     &&
26890 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
268a0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
268b0 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20  E)==0 .  ));..  
268c0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57  /* Only one of W
268d0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
268e0 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45 5f 4c  E or WHERE_USE_L
268f0 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65 72 74  IMIT */.  assert
26900 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
26910 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
26920 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  SE)==0.         
26930 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
26940 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  s & WHERE_USE_LI
26950 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  MIT)==0 );..  /*
26960 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61   Variable initia
26970 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62  lization */.  db
26980 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
26990 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30   memset(&sWLB, 0
269a0 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b  , sizeof(sWLB));
269b0 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f  ..  /* An ORDER/
269c0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
269d0 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20  of more than 63 
269e0 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20  terms cannot be 
269f0 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74  optimized */.  t
26a00 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72 42  estcase( pOrderB
26a10 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e  y && pOrderBy->n
26a20 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  Expr==BMS-1 );. 
26a30 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
26a40 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
26a50 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79  >=BMS ) pOrderBy
26a60 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72   = 0;.  sWLB.pOr
26a70 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
26a80 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  ;..  /* Disable 
26a90 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74  the DISTINCT opt
26aa0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c  imization if SQL
26ab0 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
26ac0 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20  is set via.  ** 
26ad0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72  sqlite3_test_ctr
26ae0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
26af0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
26b00 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ...) */.  if( Op
26b10 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
26b20 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69  ed(db, SQLITE_Di
26b30 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20  stinctOpt) ){.  
26b40 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20    wctrlFlags &= 
26b50 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54  ~WHERE_WANT_DIST
26b60 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  INCT;.  }..  /* 
26b70 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
26b80 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
26b90 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
26ba0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
26bb0 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
26bc0 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
26bd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
26be0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
26bf0 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
26c00 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
26c10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26c20 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
26c30 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
26c40 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
26c50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
26c60 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
26c70 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
26c80 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
26c90 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
26ca0 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
26cb0 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
26cc0 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52 5f 53  f the WHERE_OR_S
26cd0 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73  UBCLAUSE flag is
26ce0 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68   set, then we sh
26cf0 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67  ould.  ** only g
26d00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
26d10 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
26d20 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64   in pTabList and
26d30 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a   assume that.  *
26d40 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73  * any cursors as
26d50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75  sociated with su
26d60 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20  bsequent tables 
26d70 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  are uninitialize
26d80 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69  d..  */.  nTabLi
26d90 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73  st = (wctrlFlags
26da0 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
26db0 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70 54 61  LAUSE) ? 1 : pTa
26dc0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
26dd0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
26de0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
26df0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
26e00 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
26e10 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
26e20 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
26e30 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
26e40 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
26e50 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
26e60 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
26e70 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
26e80 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
26e90 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
26ea0 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
26eb0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
26ec0 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
26ed0 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
26ee0 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
26ef0 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
26f00 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
26f10 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
26f20 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
26f30 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
26f40 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
26f50 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
26f60 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42  below..  */.  nB
26f70 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
26f80 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
26f90 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
26fa0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
26fb0 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
26fc0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
26fd0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
26fe0 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
26ff0 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
27000 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
27020 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
27030 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
27040 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
27050 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
27060 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
27070 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
27080 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
27090 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
270a0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
270b0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
270c0 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
270d0 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
270e0 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
270f0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
27100 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
27110 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74  .  pWInfo->pDist
27120 69 6e 63 74 53 65 74 20 3d 20 70 44 69 73 74 69  inctSet = pDisti
27130 6e 63 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f  nctSet;.  pWInfo
27140 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66  ->iBreak = pWInf
27150 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  o->iContinue = s
27160 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
27170 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
27180 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
27190 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
271a0 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41  nfo->iLimit = iA
271b0 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d  uxArg;.  pWInfo-
271c0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
271d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
271e0 79 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  yLoop;.  assert(
271f0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
27200 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s==ONEPASS_OFF )
27210 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65  ;  /* ONEPASS de
27220 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f  faults to OFF */
27230 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
27240 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
27250 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
27260 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
27270 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
27280 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20  WC;.  sWLB.pNew 
27290 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28  = (WhereLoop*)((
272a0 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e  (char*)pWInfo)+n
272b0 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73  ByteWInfo);.  as
272c0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
272d0 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e  _ALIGNMENT(sWLB.
272e0 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65  pNew) );.  where
272f0 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e  LoopInit(sWLB.pN
27300 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ew);.#ifdef SQLI
27310 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e  TE_DEBUG.  sWLB.
27320 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b  pNew->cId = '*';
27330 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70  .#endif..  /* Sp
27340 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
27350 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
27360 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
27370 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
27380 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
27390 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
273a0 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
273b0 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
273c0 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
273d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
273e0 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
273f0 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
27400 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
27410 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
27420 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
27430 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  ;.    .  /* Spec
27440 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
27450 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
27460 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
27470 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
27480 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
27490 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
274a0 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
274b0 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
274c0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
274d0 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
274e0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
274f0 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
27500 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
27510 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42  tantNotJoin(sWLB
27520 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  .pWC->a[ii].pExp
27530 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
27540 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
27550 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d  Parse, sWLB.pWC-
27560 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57  >a[ii].pExpr, pW
27570 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20  Info->iBreak,.  
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55         SQLITE_JU
275a0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
275b0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
275c0 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  .wtFlags |= TERM
275d0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
275e0 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
275f0 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c  case: No FROM cl
27600 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
27610 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  nTabList==0 ){. 
27620 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
27630 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ) pWInfo->nOBSat
27640 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
27650 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72  pr;.    if( wctr
27660 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
27670 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
27680 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
27690 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
276a0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
276b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
276c0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
276d0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
276e0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
276f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
27700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 4e  .  **.  ** The N
27710 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
27720 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
27730 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73  ssigned a bitmas
27740 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a  k of 1<<N..  **.
27750 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f 66    ** The rule of
27760 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
27770 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20 74  ntence ensures t
27780 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65 20  hta if X is the 
27790 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a 2a  bitmask for.  **
277a0 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e   a table T, then
277b0 20 58 2d 31 20 69 73 20 74 68 65 20 62 69 74 6d   X-1 is the bitm
277c0 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65  ask for all othe
277d0 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  r tables to the 
277e0 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a 20  left of T..  ** 
277f0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
27800 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  ask for all tabl
27810 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
27820 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
27830 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e  .  ** important.
27840 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
27850 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
27860 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
27870 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
27880 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
27890 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
278a0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
278b0 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
278c0 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
278d0 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
278e0 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
278f0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
27900 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
27910 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
27920 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 52  he.  ** WHERE_OR
27930 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20  _SUBCLAUSE flag 
27940 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66  is set..  */.  f
27950 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
27960 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
27970 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
27980 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
27990 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72  List->a[ii].iCur
279a0 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
279b0 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72 67  3WhereTabFuncArg
279c0 73 28 70 50 61 72 73 65 2c 20 26 70 54 61 62 4c  s(pParse, &pTabL
279d0 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49  ist->a[ii], &pWI
279e0 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23  nfo->sWC);.  }.#
279f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
27a00 55 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  UG.  for(ii=0; i
27a10 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
27a20 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74  ; ii++){.    Bit
27a30 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33  mask m = sqlite3
27a40 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
27a50 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
27a60 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b  >a[ii].iCursor);
27a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 3d 3d  .    assert( m==
27a80 4d 41 53 4b 42 49 54 28 69 69 29 20 29 3b 0a 20  MASKBIT(ii) );. 
27a90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
27aa0 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
27ab0 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
27ac0 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
27ad0 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
27ae0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
27af0 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
27b00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27b10 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
27b20 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77  nError;..  if( w
27b30 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27b40 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
27b50 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73  ){.    if( isDis
27b60 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
27b70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
27b80 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
27b90 44 69 73 74 69 6e 63 74 53 65 74 29 20 29 7b 0a  DistinctSet) ){.
27ba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
27bb0 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73  TINCT marking is
27bc0 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e   pointless.  Ign
27bd0 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ore it. */.     
27be0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
27bf0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
27c00 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
27c10 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72  }else if( pOrder
27c20 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  By==0 ){.      /
27c30 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42  * Try to ORDER B
27c40 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  Y the result set
27c50 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63   to make distinc
27c60 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73  t processing eas
27c70 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  ier */.      pWI
27c80 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
27c90 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  |= WHERE_DISTINC
27ca0 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  TBY;.      pWInf
27cb0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 44  o->pOrderBy = pD
27cc0 69 73 74 69 6e 63 74 53 65 74 3b 0a 20 20 20 20  istinctSet;.    
27cd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73  }.  }..  /* Cons
27ce0 74 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c  truct the WhereL
27cf0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  oop objects */.#
27d00 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  if defined(WHERE
27d10 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20  TRACE_ENABLED). 
27d20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
27d30 65 54 72 61 63 65 20 26 20 30 78 66 66 66 66 20  eTrace & 0xffff 
27d40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
27d50 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20 4f  bugPrintf("*** O
27d60 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
27d70 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73 3a 20  ** (wctrlFlags: 
27d80 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61 67 73  0x%x",wctrlFlags
27d90 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  );.    if( wctrl
27da0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53  Flags & WHERE_US
27db0 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  E_LIMIT ){.     
27dc0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27dd0 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25 64  ntf(", limit: %d
27de0 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20 20 20  ", iAuxArg);.   
27df0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
27e00 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e 22 29  bugPrintf(")\n")
27e10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
27e20 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
27e30 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70  0x100 ){ /* Disp
27e40 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  lay all terms of
27e50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27e60 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
27e70 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74  WhereClausePrint
27e80 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d 0a  (sWLB.pWC);.  }.
27e90 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 54  #endif..  if( nT
27ea0 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65  abList!=1 || whe
27eb0 72 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42  reShortCut(&sWLB
27ec0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
27ed0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
27ee0 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28  (&sWLB);.    if(
27ef0 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65   rc ) goto where
27f00 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23  BeginError;.  .#
27f10 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
27f20 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
27f30 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
27f40 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69 73 70  ce ){    /* Disp
27f50 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57  lay all of the W
27f60 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
27f70 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65 4c   */.      WhereL
27f80 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e  oop *p;.      in
27f90 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69  t i;.      stati
27fa0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61  c const char zLa
27fb0 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  bel[] = "0123456
27fc0 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  789abcdefghijklm
27fd0 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20  nopqrstuvwyxz". 
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43              "ABC
28010 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
28020 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20  TUVWYXZ";.      
28030 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  for(p=pWInfo->pL
28040 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d  oops, i=0; p; p=
28050 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b  p->pNextLoop, i+
28060 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63  +){.        p->c
28070 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69  Id = zLabel[i%si
28080 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20  zeof(zLabel)];. 
28090 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
280a0 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57  Print(p, sWLB.pW
280b0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
280c0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20  }.#endif.  .    
280d0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
280e0 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20  pWInfo, 0);.    
280f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
28100 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
28110 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
28120 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
28130 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
28140 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
28150 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
28160 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20  nRowOut+1);.    
28170 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
28180 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
28190 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
281a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
281b0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
281c0 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  ==0 && (db->flag
281d0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
281e0 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20  seOrder)!=0 ){. 
281f0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
28200 61 73 6b 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20  ask = ALLBITS;. 
28210 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
28220 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64  >nErr || NEVER(d
28230 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
28240 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
28250 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
28260 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  }.#ifdef WHERETR
28270 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
28280 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
28290 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
282a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
282b0 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f  --- Solution nRo
282c0 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e  w=%d", pWInfo->n
282d0 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  RowOut);.    if(
282e0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e   pWInfo->nOBSat>
282f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
28300 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
28310 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c  ORDERBY=%d,0x%ll
28320 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  x", pWInfo->nOBS
28330 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  at, pWInfo->revM
28340 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
28350 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
28360 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
28370 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
28380 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
28390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
283a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
283b0 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
283c0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
283d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
283e0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
283f0 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
28400 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
28410 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
28420 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
28430 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
28450 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
28460 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
28470 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
28480 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
28490 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
284a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
284b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
284c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
284d0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
284e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
284f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
28500 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
28510 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
28520 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
28530 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d  sWLB.pWC);.    }
28540 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
28550 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
28560 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
28570 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
28580 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
28590 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
285a0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
285b0 20 20 26 26 20 70 44 69 73 74 69 6e 63 74 53 65    && pDistinctSe
285c0 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  t!=0.   && Optim
285d0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
285e0 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f  b, SQLITE_OmitNo
285f0 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20  opJoin).  ){.   
28600 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64   Bitmask tabUsed
28610 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
28620 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61  xprListUsage(pMa
28630 73 6b 53 65 74 2c 20 70 44 69 73 74 69 6e 63 74  skSet, pDistinct
28640 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57  Set);.    if( sW
28650 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  LB.pOrderBy ){. 
28660 20 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20       tabUsed |= 
28670 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
28680 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53  ListUsage(pMaskS
28690 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  et, sWLB.pOrderB
286a0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  y);.    }.    wh
286b0 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ile( pWInfo->nLe
286c0 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  vel>=2 ){.      
286d0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
286e0 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70  , *pEnd;.      p
286f0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Loop = pWInfo->a
28700 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  [pWInfo->nLevel-
28710 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  1].pWLoop;.     
28720 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54   if( (pWInfo->pT
28730 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
28740 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f 69 6e 74 79  >iTab].fg.jointy
28750 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30  pe & JT_LEFT)==0
28760 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28770 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
28780 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
28790 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20  TINCT)==0.      
287a0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
287b0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
287c0 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  OW)==0.      ){.
287d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
287e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
287f0 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f   (tabUsed & pLoo
28800 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  p->maskSelf)!=0 
28810 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
28820 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e  End = sWLB.pWC->
28830 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54  a + sWLB.pWC->nT
28840 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  erm;.      for(p
28850 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61  Term=sWLB.pWC->a
28860 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54  ; pTerm<pEnd; pT
28870 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
28880 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
28890 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
288a0 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20  askSelf)!=0.    
288b0 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
288c0 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
288d0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
288e0 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  in).        ){. 
288f0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
28900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28910 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  }.      if( pTer
28920 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a  m<pEnd ) break;.
28930 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
28940 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72  (0xffff, ("-> dr
28950 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75  op loop %c not u
28960 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63  sed\n", pLoop->c
28970 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  Id));.      pWIn
28980 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20  fo->nLevel--;.  
28990 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a      nTabList--;.
289a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52      }.  }.  WHER
289b0 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22  ETRACE(0xffff,("
289c0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69  *** Optimizer Fi
289d0 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b  nished ***\n"));
289e0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
289f0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d  e->nQueryLoop +=
28a00 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
28a10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
28a20 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41  aller is an UPDA
28a30 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
28a40 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
28a50 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74  equesting.  ** t
28a60 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73  o use a one-pass
28a70 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65   algorithm, dete
28a80 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73  rmine if this is
28a90 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20   appropriate..  
28aa0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
28ab0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28ac0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
28ad0 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
28ae0 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
28af0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
28b00 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
28b10 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20  ESIRED)!=0 ){.  
28b20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20    int wsFlags = 
28b30 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
28b40 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  oop->wsFlags;.  
28b50 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20    int bOnerow = 
28b60 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
28b70 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20  _ONEROW)!=0;.   
28b80 20 69 66 28 20 62 4f 6e 65 72 6f 77 0a 20 20 20   if( bOnerow.   
28b90 20 20 7c 7c 20 28 28 77 63 74 72 6c 46 6c 61 67    || ((wctrlFlag
28ba0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
28bb0 53 5f 4d 55 4c 54 49 52 4f 57 29 21 3d 30 0a 20  S_MULTIROW)!=0. 
28bc0 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
28bd0 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
28be0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 0a  _VIRTUALTABLE)).
28bf0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 57 49      ){.      pWI
28c00 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20  nfo->eOnePass = 
28c10 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53  bOnerow ? ONEPAS
28c20 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41  S_SINGLE : ONEPA
28c30 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20  SS_MULTI;.      
28c40 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
28c50 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62  bList->a[0].pTab
28c60 29 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20  ) && (wsFlags & 
28c70 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
28c80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
28c90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28ca0 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52  E_ONEPASS_MULTIR
28cb0 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
28cc0 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46  bFordelete = OPF
28cd0 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20  LAG_FORDELETE;. 
28ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28cf0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
28d00 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
28d10 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52  (wsFlags & ~WHER
28d20 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20  E_IDX_ONLY);.   
28d30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
28d40 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
28d50 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
28d60 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
28d70 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
28d80 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
28d90 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
28da0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20   */.  for(ii=0, 
28db0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
28dc0 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  ; ii<nTabList; i
28dd0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
28de0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
28df0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
28e00 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
28e10 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
28e20 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
28e30 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
28e40 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
28e50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28e60 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  item *pTabItem;.
28e70 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
28e80 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
28e90 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
28ea0 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
28eb0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20  ->pTab;.    iDb 
28ec0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
28ed0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
28ee0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70  >pSchema);.    p
28ef0 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
28f00 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28  WLoop;.    if( (
28f10 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
28f20 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
28f30 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
28f40 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
28f50 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
28f60 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
28f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
28f80 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
28f90 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
28fa0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
28fb0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
28fc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56    const char *pV
28fd0 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
28fe0 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
28ff0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
29000 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
29010 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
29020 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
29030 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
29040 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
29050 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  , 0, pVTab, P4_V
29060 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TAB);.    }else 
29070 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
29080 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
29090 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  noop */.    }els
290a0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
290b0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
290c0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
290d0 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
290e0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
290f0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
29100 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
29110 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
29120 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Read;.      if( 
29130 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
29140 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b  !=ONEPASS_OFF ){
29150 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
29160 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
29170 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75      pWInfo->aiCu
29180 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54  rOnePass[0] = pT
29190 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
291a0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
291b0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
291c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
291d0 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
291e0 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
291f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
29200 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65  em->iCursor==pLe
29210 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a  vel->iTabCur );.
29220 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29230 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
29240 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
29250 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
29260 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
29270 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
29280 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
29290 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
292a0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
292b0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
292c0 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
292d0 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  F && pTab->nCol<
292e0 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64 28  BMS && HasRowid(
292f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
29300 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
29310 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
29320 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
29330 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
29340 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
29350 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
29360 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
29370 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54  , -1, SQLITE_INT
29380 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
29390 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
293a0 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
293b0 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
293c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
293d0 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
293e0 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  S.      if( pLoo
293f0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
29400 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x!=0 ){.        
29410 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
29420 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45  eP5(v, OPFLAG_SE
29430 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29  EKEQ|bFordelete)
29440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
29450 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
29460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29470 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72  ChangeP5(v, bFor
29480 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d  delete);.      }
29490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
294a0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
294b0 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c  D_MASK.      sql
294c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
294d0 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
294e0 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e  Used, pTabItem->
294f0 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20  iCursor, 0, 0,. 
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
29520 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d  t u8*)&pTabItem-
29530 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  >colUsed, P4_INT
29540 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
29550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
29560 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
29570 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
29580 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
29590 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
295a0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
295b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
295c0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e  EXED ){.      In
295d0 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70  dex *pIx = pLoop
295e0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
295f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64  ;.      int iInd
29600 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74  exCur;.      int
29610 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61   op = OP_OpenRea
29620 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78  d;.      /* iAux
29630 41 72 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  Arg is always se
29640 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69  t if to a positi
29650 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50  ve value if ONEP
29660 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ASS is possible 
29670 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
29680 20 69 41 75 78 41 72 67 21 3d 30 20 7c 7c 20 28   iAuxArg!=0 || (
29690 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
296a0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
296b0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29  SS_DESIRED)==0 )
296c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73  ;.      if( !Has
296d0 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 49  Rowid(pTab) && I
296e0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
296f0 28 70 49 78 29 0a 20 20 20 20 20 20 20 26 26 20  (pIx).       && 
29700 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
29710 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
29720 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )!=0.      ){.  
29730 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
29740 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20   one term of an 
29750 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR-optimization 
29760 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52  using the PRIMAR
29770 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20  Y KEY of a.     
29780 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f     ** WITHOUT RO
29790 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e  WID table.  No n
297a0 65 65 64 20 66 6f 72 20 61 20 73 65 70 61 72 61  eed for a separa
297b0 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  te index */.    
297c0 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
297d0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b  pLevel->iTabCur;
297e0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b  .        op = 0;
297f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29800 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
29810 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s!=ONEPASS_OFF )
29820 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
29830 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  *pJ = pTabItem->
29840 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
29850 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
29860 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20  = iAuxArg;.     
29870 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c     assert( wctrl
29880 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
29890 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b  EPASS_DESIRED );
298a0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
298b0 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a  ALWAYS(pJ) && pJ
298c0 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20  !=pIx ){.       
298d0 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a     iIndexCur++;.
298e0 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70            pJ = p
298f0 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  J->pNext;.      
29900 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d    }.        op =
29910 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
29920 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
29930 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
29940 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
29950 20 20 7d 65 6c 73 65 20 69 66 28 20 69 41 75 78    }else if( iAux
29960 41 72 67 20 26 26 20 28 77 63 74 72 6c 46 6c 61  Arg && (wctrlFla
29970 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
29980 42 43 4c 41 55 53 45 29 21 3d 30 20 29 7b 0a 20  BCLAUSE)!=0 ){. 
29990 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
299a0 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20   = iAuxArg;.    
299b0 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70      op = OP_Reop
299c0 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c  enIdx;.      }el
299d0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  se{.        iInd
299e0 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  exCur = pParse->
299f0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nTab++;.      }.
29a00 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
29a10 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75  dxCur = iIndexCu
29a20 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
29a30 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
29a40 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
29a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49        assert( iI
29a60 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  ndexCur>=0 );.  
29a70 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20      if( op ){.  
29a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29a90 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
29aa0 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74  IndexCur, pIx->t
29ab0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
29ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
29ad0 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
29ae0 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20  e, pIx);.       
29af0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
29b00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
29b10 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20  STRAINT)!=0.    
29b20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
29b30 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
29b40 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
29b50 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d  ERE_SKIPSCAN))==
29b60 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
29b70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
29b80 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
29b90 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  MIN)==0.        
29ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
29bb0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
29bc0 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  (v, OPFLAG_SEEKE
29bd0 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43  Q); /* Hint to C
29be0 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20  OMDB2 */.       
29bf0 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65 43   }.        VdbeC
29c00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
29c10 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23   pIx->zName));.#
29c20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
29c30 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
29c40 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20  MASK.        {. 
29c50 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c           u64 col
29c60 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Used = 0;.      
29c70 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a      int ii, jj;.
29c80 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
29c90 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c  =0; ii<pIx->nCol
29ca0 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  umn; ii++){.    
29cb0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78          jj = pIx
29cc0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a  ->aiColumn[ii];.
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29ce0 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  jj<0 ) continue;
29cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29d00 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33   jj>63 ) jj = 63
29d10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29d20 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  ( (pTabItem->col
29d30 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a  Used & MASKBIT(j
29d40 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j))==0 ) continu
29d50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
29d60 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29  olUsed |= ((u64)
29d70 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20  1)<<(ii<63 ? ii 
29d80 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20  : 63);.         
29d90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
29da0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
29db0 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
29dc0 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c  Used, iIndexCur,
29dd0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29df0 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c         (u8*)&col
29e00 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b  Used, P4_INT64);
29e10 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
29e20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
29e30 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
29e40 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ASK */.      }. 
29e50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62     }.    if( iDb
29e60 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64  >=0 ) sqlite3Cod
29e70 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
29e80 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
29e90 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
29ea0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
29eb0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
29ec0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29ed0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
29ee0 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a  eginError;..  /*
29ef0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
29f00 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
29f10 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
29f20 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
29f30 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
29f40 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
29f50 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
29f60 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
29f70 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
29f80 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
29f90 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
29fa0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54   for(ii=0; ii<nT
29fb0 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20  abList; ii++){. 
29fc0 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61     int addrExpla
29fd0 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c  in;.    int wsFl
29fe0 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ags;.    pLevel 
29ff0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
2a000 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20  ;.    wsFlags = 
2a010 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2a020 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66  wsFlags;.#ifndef
2a030 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a040 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
2a050 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57   if( (pLevel->pW
2a060 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2a070 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
2a080 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
2a090 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
2a0a0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 70  Index(pParse, &p
2a0b0 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20  WInfo->sWC,.    
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
2a0d0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2a0e0 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64  >iFrom], notRead
2a0f0 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
2a100 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2a110 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2a120 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2a130 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2a140 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71  addrExplain = sq
2a150 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61 69  lite3WhereExplai
2a160 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
2a170 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69    pParse, pTabLi
2a180 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20  st, pLevel, ii, 
2a190 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
2a1a0 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b  ctrlFlags.    );
2a1b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2a1c0 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  rBody = sqlite3V
2a1d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2a1e0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2a1f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  = sqlite3WhereCo
2a200 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
2a210 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
2a220 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
2a230 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
2a240 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
2a250 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
2a260 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
2a270 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61  ==0 && (wctrlFla
2a280 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  gs&WHERE_OR_SUBC
2a290 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  LAUSE)==0 ){.   
2a2a0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41     sqlite3WhereA
2a2b0 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20  ddScanStatus(v, 
2a2c0 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
2a2d0 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  , addrExplain);.
2a2e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2a2f0 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d  Done. */.  VdbeM
2a300 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2a310 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f   "Begin WHERE-co
2a320 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  re"));.  return 
2a330 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
2a340 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
2a350 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
2a360 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
2a370 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
2a380 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2a390 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
2a3a0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
2a3b0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2a3c0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
2a3d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2a3e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
2a3f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
2a400 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
2a410 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
2a420 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a430 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
2a440 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2a450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
2a460 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
2a470 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
2a480 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
2a490 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
2a4a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2a4b0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2a4c0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2a4d0 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
2a4e0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
2a4f0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
2a500 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2a510 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2a520 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2a530 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
2a540 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
2a550 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ode..  */.  Vdbe
2a560 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2a570 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72  , "End WHERE-cor
2a580 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  e"));.  sqlite3E
2a590 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2a5a0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
2a5b0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
2a5c0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2a5d0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
2a5e0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2a5f0 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
2a600 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2a610 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
2a620 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2a630 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
2a640 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
2a650 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
2a660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a670 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70  3VdbeAddOp3(v, p
2a680 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
2a690 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
2a6a0 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a  2, pLevel->p3);.
2a6b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a6c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
2a6d0 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20  vel->p5);.      
2a6e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2a6f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2a700 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2a710 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20  >op==OP_Next);. 
2a720 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2a730 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2a740 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20  p==OP_Prev);.   
2a750 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2a760 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2a770 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20  =OP_VNext);.    
2a780 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
2a790 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2a7a0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
2a7b0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
2a7c0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
2a7d0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
2a7e0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
2a7f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2a800 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2a810 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
2a820 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
2a830 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
2a840 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
2a850 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
2a860 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
2a870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2a880 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
2a890 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
2a8a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a8b0 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
2a8c0 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
2a8d0 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
2a8e0 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
2a8f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2a900 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
2a910 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
2a920 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50  eEndLoopOp==OP_P
2a930 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  revIfOpen);.    
2a940 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2a950 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  If(v, pIn->eEndL
2a960 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66  oopOp==OP_NextIf
2a970 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  Open);.        s
2a980 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2a990 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
2a9a0 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
2a9b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a9c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2a9d0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2a9e0 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
2a9f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2aa00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2aa10 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
2aa20 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
2aa30 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2aa40 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
2aa50 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
2aa60 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2aa70 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
2aa80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2aa90 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2aaa0 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
2aab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2aac0 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2aad0 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
2aae0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2aaf0 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
2ab00 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20  _MATCH_BLOBS.   
2ab10 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
2ab20 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20  rLikeRep ){.    
2ab30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ab40 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
2ab50 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c  mpZero, (int)(pL
2ab60 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
2ab70 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20  tr>>1),.        
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab90 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
2aba0 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Rep);.      Vdbe
2abb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2abc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
2abd0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
2abe0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64  oin ){.      add
2abf0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2ac00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
2ac10 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
2ac20 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72  Join); VdbeCover
2ac30 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73  age(v);.      as
2ac40 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  sert( (pLoop->ws
2ac50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2ac60 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
2ac70 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d        || (pLoop-
2ac80 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2ac90 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
2aca0 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
2acb0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2acc0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
2acd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ace0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2acf0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
2ad00 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2ad10 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2ad20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2ad30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2ad40 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  EXED ){.        
2ad50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ad60 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
2ad70 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2ad80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ad90 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
2ada0 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
2adb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2adc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2add0 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
2ade0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2adf0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
2ae00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ae10 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
2ae20 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
2ae30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2ae40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2ae50 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
2ae60 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c   }.    VdbeModul
2ae70 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
2ae80 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  d WHERE-loop%d: 
2ae90 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  %s", i,.        
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
2aeb0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2aec0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
2aed0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2aee0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
2aef0 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
2af00 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
2af10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
2af20 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
2af30 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
2af40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2af50 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
2af60 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65  iBreak);..  asse
2af70 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
2af80 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
2af90 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
2afa0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2afb0 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
2afc0 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
2afd0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  ++){.    int k, 
2afe0 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70  last;.    VdbeOp
2aff0 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78   *pOp;.    Index
2b000 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
2b010 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2b020 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
2b030 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2b040 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2b050 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2b060 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2b070 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2b080 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
2b090 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2b0a0 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  ;..    /* For a 
2b0b0 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e  co-routine, chan
2b0c0 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e  ge all OP_Column
2b0d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2b0e0 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
2b0f0 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  ** the co-routin
2b100 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f  e into OP_Copy o
2b110 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  f result contain
2b120 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
2b130 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69  ..    ** OP_Rowi
2b140 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c  d becomes OP_Nul
2b150 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
2b160 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76  ( pTabItem->fg.v
2b170 69 61 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21  iaCoroutine && !
2b180 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b190 20 29 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c   ){.      transl
2b1a0 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
2b1b0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
2b1c0 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
2b1d0 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
2b200 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  esult, 0);.     
2b210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2b220 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  ..    /* Close a
2b230 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
2b240 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
2b250 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
2b260 72 65 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20  reBegin..    ** 
2b270 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63  Except, do not c
2b280 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 74 68 61  lose cursors tha
2b290 74 20 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64  t will be reused
2b2a0 20 62 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d   by the OR optim
2b2b0 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28  ization.    ** (
2b2c0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2b2d0 53 45 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74  SE).  And do not
2b2e0 20 63 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70   close the OP_Op
2b2f0 65 6e 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a  enWrite cursors.
2b300 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66      ** created f
2b310 6f 72 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f  or the ONEPASS o
2b320 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20  ptimization..   
2b330 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61   */.    if( (pTa
2b340 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
2b350 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20  _Ephemeral)==0. 
2b360 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65      && pTab->pSe
2b370 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20  lect==0.     && 
2b380 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2b390 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
2b3a0 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20  UBCLAUSE)==0.   
2b3b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
2b3c0 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
2b3d0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  s;.      if( pWI
2b3e0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2b3f0 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77  NEPASS_OFF && (w
2b400 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2b410 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
2b420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b430 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
2b440 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2b450 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
2b460 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
2b470 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2b480 20 20 20 20 20 20 26 26 20 28 77 73 20 26 20 28        && (ws & (
2b490 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
2b4a0 41 55 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20  AUTO_INDEX))==0 
2b4b0 0a 20 20 20 20 20 20 20 26 26 20 70 4c 65 76 65  .       && pLeve
2b4c0 6c 2d 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e  l->iIdxCur!=pWIn
2b4d0 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
2b4e0 5b 31 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  [1].      ){.   
2b4f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b500 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
2b510 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
2b520 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
2b530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2b540 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
2b550 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42   index, make VDB
2b560 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  E code substitut
2b570 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
2b580 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
2b590 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  e index instead 
2b5a0 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  of from the tabl
2b5b0 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  e where possible
2b5c0 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  .  In some cases
2b5d0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  .    ** this opt
2b5e0 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e  imization preven
2b5f0 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ts the table fro
2b600 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61  m ever being rea
2b610 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20  d, which can.   
2b620 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e   ** yield a sign
2b630 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61  ificant performa
2b640 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a  nce boost..    *
2b650 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
2b660 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
2b670 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
2b680 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2b690 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
2b6a0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
2b6b0 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
2b6c0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
2b6d0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
2b6e0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
2b6f0 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
2b700 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
2b710 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
2b720 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
2b730 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
2b740 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
2b750 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
2b760 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
2b770 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
2b780 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
2b790 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2b7a0 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
2b7b0 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  D|WHERE_IDX_ONLY
2b7c0 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  ) ){.      pIdx 
2b7d0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2b7e0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  .pIndex;.    }el
2b7f0 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
2b800 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
2b810 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
2b820 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
2b830 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
2b840 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20      if( pIdx.   
2b850 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f    && (pWInfo->eO
2b860 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2b870 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  OFF || !HasRowid
2b880 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a  (pIdx->pTable)).
2b890 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c       && !db->mal
2b8a0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b  locFailed.    ){
2b8b0 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
2b8c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2b8d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b  Addr(v);.      k
2b8e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
2b8f0 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  ody;.      pOp =
2b900 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
2b910 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
2b920 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
2b930 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
2b940 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
2b950 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
2b960 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2b970 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
2b980 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
2b990 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78  .          int x
2b9a0 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2b9b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2b9c0 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62  dx->pTable==pTab
2b9d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2b9e0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2b9f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2ba00 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
2ba10 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2ba20 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2ba30 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
2ba40 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20  >aiColumn[x];.  
2ba50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ba60 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
2ba70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ba80 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
2ba90 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78  nOfIndex(pIdx, x
2baa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2bab0 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   x>=0 ){.       
2bac0 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78       pOp->p2 = x
2bad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  ;.            pO
2bae0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2baf0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2bb00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
2bb10 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
2bb20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2bb30 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78  DX_ONLY)==0 || x
2bb40 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  >=0 );.        }
2bb50 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2bb60 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
2bb70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
2bb80 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2bb90 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2bba0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2bbb0 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
2bbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2bbd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
2bbe0 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
2bbf0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  .  pParse->nQuer
2bc00 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
2bc10 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
2bc20 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
2bc30 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2bc40 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.