/ Hex Artifact Content
Login

Artifact d22a2ae7f823f5405e5d00c3397204ce1272d53bc3f2fc0c516315f143eb1a24:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e  pareSkip(pTerm->
1ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64 78       pScan->pIdx
1b10: 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20  Expr,iCur)==0). 
1b20: 20 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61          && (pSca
1b30: 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20  n->iEquiv<=1 || 
1b40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b50: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1b60: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
1b70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b80: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
1ba0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
1bb0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
1bc0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
1bd0: 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20  an->aiCur).     
1be0: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73        && (pX = s
1bf0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c00: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
1c10: 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70  pr->pRight))->op
1c20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1c30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c40: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1c50: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c60: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
1c70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1c80: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1c90: 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69  >aiCur[j]==pX->i
1ca0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
1cb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
1cc0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e  iColumn[j]==pX->
1cd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
1d30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72      pScan->aiCur
1d50: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
1d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d70: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1d80: 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  j] = pX->iColumn
1d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1da0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b  pScan->nEquiv++;
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
1df0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e10: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
1e20: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
1e30: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
1e40: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
1e50: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
1e60: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
1e70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e80: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
1ea0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1eb0: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
1ec0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
1ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
1ef0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
1f20: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
1f30: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1f80: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
1f90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1fc0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
2000: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2020: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
2030: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2040: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2050: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2070: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
2080: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20d0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
20e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20f0: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
2100: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
2110: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
2120: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
2130: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
2150: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72  le==pScan->aiCur
2160: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
2170: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
2180: 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e  =pScan->aiColumn
2190: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
21a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
21e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2200: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2210: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  pWC = pWC;.     
2220: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
2230: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
2240: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
2250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2270: 20 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e       pWC = pWC->
2280: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
2290: 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
22a0: 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pWC!=0 );.    i
22b0: 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  f( pScan->iEquiv
22c0: 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  >=pScan->nEquiv 
22d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 57 43  ) break;.    pWC
22e0: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
22f0: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
2300: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b    pScan->iEquiv+
2310: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
2330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
2340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
2350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
2380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
2390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
23a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
23b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
23c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
23e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
23f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
2430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
2440: 2e 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d  .   Or if pIdx!=
2450: 30 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75  0 then X is colu
2460: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e  mn iColumn of in
2470: 64 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a  dex pIdx.  pIdx.
2480: 2a 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  ** must be one o
2490: 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66  f the indexes of
24a0: 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a   table iCur..**.
24b0: 2a 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  ** The <op> must
24c0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
24d0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
24e0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
24f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
2500: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
2510: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2520: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
2530: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
2540: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
2550: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
2560: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
2570: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
2580: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
2590: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
25a0: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
25b0: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
25c0: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
25d0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
25e0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
25f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2600: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
2610: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
2620: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
2630: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
2640: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
2650: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
2660: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
2670: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
2680: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
2690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
26a0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
26b0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
26c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
26d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
26e0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26f0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
2700: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2720: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
2730: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2740: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2750: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
2760: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
2770: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
2780: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
2790: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
27a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
27c0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
27d0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
27e0: 20 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e   */.){.  pScan->
27f0: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
2800: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
2810: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78  C;.  pScan->pIdx
2820: 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61  Expr = 0;.  pSca
2830: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
2840: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2850: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64  e = 0;.  if( pId
2860: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  x ){.    int j =
2870: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
2880: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
2890: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28a0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45  f( iColumn==XN_E
28b0: 58 50 52 20 29 7b 0a 20 20 20 20 20 20 70 53 63  XPR ){.      pSc
28c0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 70  an->pIdxExpr = p
28d0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
28e0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
28f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2900: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2910: 5b 6a 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [j];.    }else i
2920: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
2930: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2940: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
2950: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
2960: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
2970: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  mn>=0 ){.      p
2980: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
2990: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
29a0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
29b0: 69 74 79 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ity;.      pScan
29c0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
29d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
29e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29f0: 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50   iColumn==XN_EXP
2a00: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
2a10: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2a20: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2a30: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2a40: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2a50: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
2a60: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
2a70: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
2a80: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
2a90: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
2aa0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
2ab0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2ac0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2ad0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2ae0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2af0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2b00: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b10: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2b20: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2b30: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2b40: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72  of table iCur or
2b50: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a   of index pIdx.*
2b60: 2a 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64  * if pIdx!=0 and
2b70: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2b80: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2b90: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2ba0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20  ed by.** the op 
2bb0: 70 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75  parameter.  Retu
2bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2bd0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
2be0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21  ..**.** If pIdx!
2c00: 3d 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  =0 then it must 
2c10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
2c20: 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69  dexes of table i
2c30: 43 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68  Cur.  .** Search
2c40: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2c50: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2c60: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2c70: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2c80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2ca0: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2cb0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
2cc0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
2cd0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
2ce0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
2cf0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d00: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
2d10: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2d20: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2d30: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2d40: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2d50: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2d60: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2d70: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2d80: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2d90: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2da0: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2db0: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2dc0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2dd0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2de0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2df0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2e00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2e10: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2e20: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2e30: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2e40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2e50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2e60: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2e70: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2e80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2e90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2eb0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ec0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2ee0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2ef0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2f00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2f10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2f20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2f30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2f40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2f50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2f60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2f70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2f80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2f90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2fa0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2fb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2fc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2fd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2fe0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2ff0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
3000: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
3010: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
3020: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
3030: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
3040: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
3050: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
3060: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
3070: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
3080: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3090: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
30a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
30b0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
30c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
30d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
30e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
30f0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3100: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3110: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3120: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3130: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3140: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3150: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3160: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3190: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
31a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
31b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
31c0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
31d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
31e0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
31f0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
3200: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
3210: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
3220: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
3230: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
3240: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
3250: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
3260: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
3270: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
3280: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
3290: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
32a0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
32b0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
32c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
32d0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
32e0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
32f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3300: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
3310: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3320: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3330: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3340: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3350: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3360: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3370: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3380: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3390: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
33c0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
33d0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
33e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
3400: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
3410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3420: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3430: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3440: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3450: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3460: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3480: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3490: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
34a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
34b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
34d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
3500: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
3510: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3540: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3550: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3560: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3580: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3590: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
35a0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
35d0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
35e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
35f0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
3600: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
3610: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3640: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3650: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3660: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3670: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3680: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
36a0: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
36b0: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
36c0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
36d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
36e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
36f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3700: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
3710: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
3720: 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
3730: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
3740: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
3750: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3760: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
3770: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3780: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
3790: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
37a0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
37b0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  f index pIdx is 
37c0: 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74  NOT NULL.*/.stat
37d0: 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75  ic int indexColu
37e0: 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20  mnNotNull(Index 
37f0: 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29  *pIdx, int iCol)
3800: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
3810: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
3820: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
3830: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
3840: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d  nColumn );.  j =
3850: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
3860: 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d  iCol];.  if( j>=
3870: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3880: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3890: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20  ol[j].notNull;. 
38a0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d   }else if( j==(-
38b0: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
38c0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
38d0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29   assert( j==(-2)
38e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
38f0: 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20  ;  /* Assume an 
3900: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
3910: 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79 69  on can always yi
3920: 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  eld a NULL */.. 
3930: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3940: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
3950: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
3960: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
3970: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
3980: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
3990: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
39a0: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
39b0: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
39c0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
39d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
39e0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
39f0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
3a00: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
3a10: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
3a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3a30: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
3a40: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
3a50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3a60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3a70: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
3a80: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
3a90: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
3aa0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
3ab0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3ac0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
3ad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
3ae0: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
3af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
3b00: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
3b10: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
3b20: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
3b30: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
3b40: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
3b70: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
3b80: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
3b90: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
3ba0: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
3bb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
3bc0: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
3bd0: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
3be0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
3bf0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
3c00: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
3c10: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
3c20: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
3c30: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
3c40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
3c50: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
3c60: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
3c70: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3c80: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
3c90: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
3ca0: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
3cb0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
3cc0: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
3cd0: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
3ce0: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
3cf0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
3d00: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
3d10: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
3d20: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
3d30: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
3d40: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
3d50: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
3d60: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
3d70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3d80: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
3d90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3da0: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
3db0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3dc0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3dd0: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
3de0: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
3df0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
3e00: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3e10: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
3e20: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
3e30: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
3e40: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
3e50: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
3e60: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
3e70: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
3e80: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
3e90: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
3ea0: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
3eb0: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
3ec0: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
3ed0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
3ee0: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
3ef0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
3f00: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
3f10: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
3f20: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
3f30: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
3f40: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
3f50: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
3f60: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
3f70: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
3f80: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
3f90: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
3fa0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
3fb0: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
3fc0: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
3fd0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
3fe0: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
3ff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
4000: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
4010: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
4020: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
4030: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
4040: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
4050: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
4060: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
4070: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
4080: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
4090: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
40a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
40b0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
40c0: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
40d0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
40e0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
40f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
4100: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4110: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
4120: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
4130: 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69 74   iBase, i, ~(Bit
4140: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
4150: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
4160: 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  if( findIndexCol
4170: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
4180: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
4190: 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   i)<0 ) break;. 
41a0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65 78         if( index
41b0: 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49  ColumnNotNull(pI
41c0: 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65 61  dx, i)==0 ) brea
41d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
41e0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
41f0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
4200: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
4210: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
4220: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4230: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
4240: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
4250: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4260: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4270: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
4280: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
4290: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
42a0: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
42b0: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
42c0: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
42d0: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
42e0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
42f0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
4300: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43  .** Convert OP_C
4310: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f  olumn opcodes to
4320: 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65 76   OP_Copy in prev
4330: 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
4340: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   code..**.** Thi
4350: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f  s routine runs o
4360: 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56 44  ver generated VD
4370: 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61 6e  BE code and tran
4380: 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e  slates OP_Column
4390: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f  .** opcodes into
43a0: 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74 68   OP_Copy when th
43b0: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
43c0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
43d0: 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e 73  -routine .** ins
43e0: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
43f0: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20  e lookup..**.** 
4400: 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77 69  If the bIncrRowi
4410: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
4420: 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f  , then any OP_Ro
4430: 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  wid instructions
4440: 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54   on.** cursor iT
4450: 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66  abCur are transf
4460: 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e 75  ormed into OP_Nu
4470: 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63 72  ll. Or, if bIncr
4480: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
4490: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68 20  o,.** then each 
44a0: 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61 6e  OP_Rowid is tran
44b0: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e 20  sformed into an 
44c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 69  instruction to i
44d0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
44e0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
44f0: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
4500: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4510: 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c  oid translateCol
4520: 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50 61 72  umnToCopy(.  Par
4530: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4540: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4550: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ext */.  int iSt
4560: 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  art,         /* 
4570: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 74  Translate from t
4580: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  his opcode to th
4590: 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  e end */.  int i
45a0: 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20 2f  TabCur,        /
45b0: 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52  * OP_Column/OP_R
45c0: 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73 20  owid references 
45d0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
45e0: 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65 72  .  int iRegister
45f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ,      /* The fi
4600: 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  rst column is in
4610: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4620: 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f 77  /.  int bIncrRow
4630: 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  id      /* If no
4640: 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f 72  n-zero, transfor
4650: 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f 50  m OP_rowid to OP
4660: 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29 7b  _AddImm(1) */.){
4670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64  rse->pVdbe;.  Vd
4690: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
46a0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
46b0: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
46c0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
46d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
46e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
46f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4710: 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69  ; iStart<iEnd; i
4720: 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Start++, pOp++){
4730: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  .    if( pOp->p1
4740: 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  !=iTabCur ) cont
4750: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
4760: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
4770: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f  lumn ){.      pO
4780: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
4790: 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  opy;.      pOp->
47a0: 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69  p1 = pOp->p2 + i
47b0: 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20  Register;.      
47c0: 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70  pOp->p2 = pOp->p
47d0: 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  3;.      pOp->p3
47e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
47f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
4800: 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
4810: 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69     if( bIncrRowi
4820: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
4830: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
4840: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
4850: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4860: 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f  the OP_Rowid. */
4870: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4880: 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d  code = OP_AddImm
4890: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48a0: 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  1 = pOp->p2;.   
48b0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31       pOp->p2 = 1
48c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
48d0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
48e0: 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20  de = OP_Null;.  
48f0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
4900: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  0;.        pOp->
4910: 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  p3 = 0;.      }.
4920: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4930: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
4940: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
4950: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
4960: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
4970: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
4980: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
4990: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
49a0: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
49b0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
49c0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
49d0: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
49e0: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
49f0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
4a00: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
4a10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
4a20: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
4a30: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
4a40: 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
4a50: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
4a60: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
4a70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4a80: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4a90: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4aa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4ab0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4ac0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4ae0: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
4af0: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
4b00: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
4b10: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
4b20: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
4b30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4b40: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
4b50: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4b60: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
4b70: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4b80: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
4b90: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4ba0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
4bb0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4bc0: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
4bd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
4be0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
4bf0: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
4c00: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
4c10: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
4c20: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
4c30: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
4c40: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
4c50: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
4c60: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
4c70: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
4c80: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4c90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4ca0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4cb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4cc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4cd0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ce0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4cf0: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
4d00: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
4d10: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
4d20: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
4d30: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
4d40: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
4d50: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4d60: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
4d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
4d80: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d90: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
4da0: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
4db0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4dc0: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
4dd0: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
4de0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4df0: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
4e00: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
4e10: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
4e20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e30: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
4e40: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
4e50: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
4e60: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e70: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52  tf("  estimatedR
4e80: 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e  ows=%lld\n", p->
4e90: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
4ea0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
4eb0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
4ec0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
4ed0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
4ee0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4ef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4f00: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
4f10: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4f20: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4f30: 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
4f40: 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
4f50: 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
4f60: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
4f70: 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
4f80: 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
4f90: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
4fa0: 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
4fb0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
4fc0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
4fd0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
4fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4ff0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
5000: 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
5010: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5020: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
5030: 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
5040: 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
5050: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
5060: 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
5070: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
5080: 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
5090: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
50a0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
50b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
50c0: 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
50d0: 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
50e0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
50f0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
5100: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65  |WO_IS))==0 ) re
5110: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
5120: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
5130: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
5140: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5150: 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
5160: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
5170: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
5180: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
5190: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
51a0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
51b0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
51c0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
51d0: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
51e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74  return 0;.  test
51f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
5200: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
5210: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5220: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
5230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
5240: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
5250: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5260: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
5270: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
5280: 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
5290: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
52a0: 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
52b0: 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
52c0: 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
52d0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
52e0: 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
52f0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
5300: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
5310: 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
5320: 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
5330: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5350: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
5360: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5370: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
5380: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
5390: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
53a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
53b0: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
53c0: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
53d0: 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
53e0: 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
53f0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
5400: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5410: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
5420: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
5430: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
5440: 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
5450: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
5460: 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
5470: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
5480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5490: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
54a0: 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
54b0: 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
54c0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
54d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
54e0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
54f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5500: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5510: 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
5520: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
5530: 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  a[] */.  Index *
5540: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
5550: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
5560: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
5570: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
5580: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55a0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
55b0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
55c0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
55d0: 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
55e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
55f0: 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
5600: 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
5610: 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
5620: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
5630: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
5640: 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
5650: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  d */.  int addrT
5660: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
5670: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
5680: 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
5690: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
56a0: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
56b0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
56c0: 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
56d0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
56e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5700: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5710: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
5730: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
5740: 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
5750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5760: 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
5770: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
5780: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
5790: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
57a0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
57b0: 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
57c0: 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
57d0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
57e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
57f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
5800: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20  r *zNotUsed;    
5810: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
5820: 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65  a space on the e
5830: 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  nd of pIdx */.  
5840: 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
5850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5860: 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
5870: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
5880: 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
5890: 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
58a0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
58b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
58c0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
58d0: 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
58e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
58f0: 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
5900: 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20  een issued */.  
5910: 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d  Expr *pPartial =
5920: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
5930: 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70  artial Index Exp
5940: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
5950: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20   iContinue = 0; 
5960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
5970: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78   here to skip ex
5980: 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20  cluded rows */. 
5990: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
59a0: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
59b0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
59c0: 74 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78  term being index
59d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
59e0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20  Counter = 0;    
59f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77      /* Address w
5a00: 68 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75  here integer cou
5a10: 6e 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  nter is initiali
5a20: 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zed */.  int reg
5a30: 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
5a40: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
5a50: 20 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65   registers where
5a60: 20 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d   record is assem
5a70: 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  bled */..  /* Ge
5a80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
5a90: 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
5aa0: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
5ab0: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
5ac0: 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
5ad0: 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
5ae0: 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
5af0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
5b00: 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
5b10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
5b20: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
5b30: 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
5b40: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
5b50: 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
5b60: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
5b70: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
5b80: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5b90: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5ba0: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
5bb0: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
5bc0: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
5bd0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
5be0: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
5bf0: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
5c00: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
5c10: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
5c20: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
5c30: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
5c40: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
5c50: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5c60: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
5c70: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
5c80: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
5c90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
5ca0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5cb0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5cc0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a  _FromJoin)    /*
5cd0: 20 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e   prereq always n
5ce0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  on-zero */.     
5cf0: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52      || pExpr->iR
5d00: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
5d10: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f  Src->iCursor   /
5d20: 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68  *   for the righ
5d30: 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20  t-hand   */.    
5d40: 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70       || pLoop->p
5d50: 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20  rereq!=0 );     
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20  /*   table of a 
5d80: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20  LEFT JOIN */.   
5d90: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72   if( pLoop->prer
5da0: 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  eq==0.     && (p
5db0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
5dc0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30  TERM_VIRTUAL)==0
5dd0: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
5de0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5df0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
5e00: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
5e10: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
5e20: 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43  (pExpr, pSrc->iC
5e30: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
5e40: 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74  pPartial = sqlit
5e50: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
5e60: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a  ->db, pPartial,.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5eb0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
5ec0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
5ed0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
5ee0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
5ef0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
5f00: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
5f10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
5f20: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
5f30: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
5f40: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
5f50: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
5f60: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
5f70: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
5f80: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
5f90: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  1 );.      if( !
5fa0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20  sentWarning ){. 
5fb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
5fc0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
5fd0: 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20  G_AUTOINDEX,.   
5fe0: 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61           "automa
5ff0: 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28  tic index on %s(
6000: 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  %s)", pTable->zN
6010: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
6020: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43   pTable->aCol[iC
6030: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
6040: 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20      sentWarning 
6050: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
6060: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
6070: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
6080: 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
6090: 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73  LoopResize(pPars
60a0: 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b  e->db, pLoop, nK
60b0: 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20  eyCol+1) ){.    
60c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
60d0: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
60e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
60f0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
6100: 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70  m[nKeyCol++] = p
6110: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
6120: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
6130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6140: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  }.  assert( nKey
6150: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  Col>0 );.  pLoop
6160: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
6170: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
6180: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70  nKeyCol;.  pLoop
6190: 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
61a0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
61b0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
61c0: 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
61f0: 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
6200: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
6210: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
6220: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
6230: 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
6240: 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
6250: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
6260: 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
6270: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
6280: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
6290: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
62a0: 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
62b0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
62c0: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
62d0: 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
62e0: 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
62f0: 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
6300: 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
6310: 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
6320: 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
6330: 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
6340: 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
6350: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
6360: 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
6370: 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
6380: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
6390: 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
63a0: 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
63b0: 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
63c0: 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
63d0: 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
63e0: 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
63f0: 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
6400: 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54  l = MIN(BMS-1,pT
6410: 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74  able->nCol);.  t
6420: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6430: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
6440: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
6450: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
6460: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6470: 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
6480: 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
6490: 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
64a0: 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a   nKeyCol++;.  }.
64b0: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
64c0: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
64d0: 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79  S-1) ){.    nKey
64e0: 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  Col += pTable->n
64f0: 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
6500: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
6510: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
6520: 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
6530: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
6540: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  pIdx = sqlite3Al
6550: 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
6560: 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  t(pParse->db, nK
6570: 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f  eyCol+1, 0, &zNo
6580: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49  tUsed);.  if( pI
6590: 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  dx==0 ) goto end
65a0: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
65b0: 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  te;.  pLoop->u.b
65c0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
65d0: 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  dx;.  pIdx->zNam
65e0: 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
65f0: 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
6600: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
6610: 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
6620: 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
6630: 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
6640: 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
6650: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
6660: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
6670: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
6680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
6690: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
66a0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
66b0: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
66c0: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
66d0: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
66e0: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
66f0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
6700: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
6710: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6720: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
6730: 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
6740: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
6750: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
6760: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
6770: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
6780: 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
6790: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
67a0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
67b0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
67c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
67d0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
67e0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
67f0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
6800: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6810: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c  zColl[n] = pColl
6820: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
6830: 3a 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  : sqlite3StrBINA
6840: 52 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  RY;.        n++;
6850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
6870: 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  2)n==pLoop->u.bt
6880: 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  ree.nEq );..  /*
6890: 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
68a0: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
68b0: 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
68c0: 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
68d0: 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
68e0: 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
68f0: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
6900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
6910: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
6920: 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  T(i) ){.      pI
6930: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6940: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
6950: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c  >azColl[n] = sql
6960: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
6970: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
6980: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
6990: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
69a0: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
69b0: 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
69c0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
69d0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
69e0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
69f0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
6a00: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6a10: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
6a20: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
6a30: 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79   assert( n==nKey
6a40: 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61  Col );.  pIdx->a
6a50: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f  iColumn[n] = XN_
6a60: 52 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61  ROWID;.  pIdx->a
6a70: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
6a80: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20  e3StrBINARY;..  
6a90: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
6aa0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
6ab0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
6ac0: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
6ad0: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
6ae0: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
6af0: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
6b00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
6b10: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
6b20: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
6b30: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
6b40: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
6b50: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
6b60: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
6b70: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
6b80: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
6b90: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
6ba0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6bb0: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
6bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6bd0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
6be0: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
6bf0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  C->pWInfo->pTabL
6c00: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
6c10: 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61  From];.  if( pTa
6c20: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
6c30: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
6c40: 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
6c50: 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
6c60: 3b 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65  ;.    addrCounte
6c70: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6c80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6c90: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6cb0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
6cc0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
6cd0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
6ce0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
6cf0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
6d00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6d10: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6d20: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6d30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6d40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6d50: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6d60: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6d70: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6d80: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6d90: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6da0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
6db0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
6dc0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
6dd0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
6de0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
6df0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
6e00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6e10: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6e20: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6e30: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6e40: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6e50: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6e60: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6e70: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6e80: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6e90: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6ea0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6eb0: 29 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73  );.  regBase = s
6ec0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
6ed0: 64 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50  dexKey(.      pP
6ee0: 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
6ef0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
6f00: 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
6f10: 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65   0.  );.  sqlite
6f20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6f30: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
6f40: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
6f50: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
6f60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6f70: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
6f80: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20  KRESULT);.  if( 
6f90: 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74  pPartial ) sqlit
6fa0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6fb0: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
6fc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
6fd0: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
6fe0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
6ff0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
7000: 61 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67  addrCounter, reg
7010: 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73  Base+n);.    tes
7020: 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
7030: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7040: 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65  );.    translate
7050: 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61  ColumnToCopy(pPa
7060: 72 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c  rse, addrTop, pL
7070: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
70a0: 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29  m->regResult, 1)
70b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
70c0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
70d0: 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d  );.    pTabItem-
70e0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
70f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7110: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
7120: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7130: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
7140: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7150: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
7160: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
7170: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
7180: 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
7190: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
71a0: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
71b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
71c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
71d0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
71e0: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
71f0: 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20  Parse);.  .  /* 
7200: 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
7210: 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
7220: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
7230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7240: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
7250: 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  ;..end_auto_inde
7260: 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69  x_create:.  sqli
7270: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7280: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
7290: 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  al);.}.#endif /*
72a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
72b0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
72c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
72e0: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
72f0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
7300: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7310: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
7320: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
7330: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
7340: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
7350: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
7360: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
7370: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
7380: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
7390: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
73a0: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
73b0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
73c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
73d0: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
73e0: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
73f0: 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
7400: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74  ause *pWC,.  Bit
7410: 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20  mask mUnusable, 
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7430: 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74  Ignore terms wit
7440: 68 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20  h these prereqs 
7450: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7460: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
7470: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
7480: 65 72 42 79 2c 0a 20 20 75 31 36 20 2a 70 6d 4e  erBy,.  u16 *pmN
7490: 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  oOmit           
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
74b0: 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20  of terms not to 
74c0: 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  omit */.){.  int
74d0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
74e0: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
74f0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7500: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
7510: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7520: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
7530: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
7540: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7550: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7560: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
7570: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7580: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
7590: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
75a0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
75b0: 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  o;.  u16 mNoOmit
75c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e   = 0;..  /* Coun
75d0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
75e0: 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63  possible WHERE c
75f0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
7600: 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a  s referring.  **
7610: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
7620: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
7630: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
7640: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
7650: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
7660: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
7670: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7680: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
76a0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
76b0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
76c0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
76d0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
76e0: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
76f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7700: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7710: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7720: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7730: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7740: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7750: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
7760: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7770: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7780: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
7790: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
77a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
77b0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
77c0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
77d0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
77e0: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
77f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7800: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7810: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7820: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7830: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7840: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7850: 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72  (-1) );.    nTer
7860: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
7870: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7880: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
7890: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
78a0: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
78b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
78c0: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
78d0: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
78e0: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
78f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7900: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7910: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
7920: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
7930: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
7940: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
7950: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
7960: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
7970: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7980: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7990: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
79a0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
79b0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
79c0: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
79d0: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
79e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
79f0: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
7a00: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
7a10: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
7a20: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
7a30: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
7a40: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
7a50: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7a60: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
7a70: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
7a80: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
7ab0: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
7ac0: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
7af0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
7b00: 79 29 2a 6e 4f 72 64 65 72 42 79 20 0a 20 20 20  y)*nOrderBy .   
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 69 66 28          );.  if(
7b30: 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
7b40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7b50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
7b60: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
7b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7b80: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
7b90: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
7ba0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
7bb0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7bc0: 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
7bd0: 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
7be0: 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
7bf0: 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
7c00: 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
7c10: 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
7c20: 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
7c30: 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
7c40: 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
7c50: 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
7c60: 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
7c70: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
7c80: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
7c90: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7ca0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
7cb0: 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
7cc0: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
7cd0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
7ce0: 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
7cf0: 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
7d00: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7d10: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7d20: 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
7d30: 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
7d40: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
7d50: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
7d60: 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
7d70: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
7d80: 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
7d90: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7da0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7db0: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
7dc0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
7dd0: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
7de0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7df0: 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
7e00: 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
7e10: 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
7e20: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
7e30: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7e40: 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
7e50: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
7e60: 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
7eb0: 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
7ec0: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
7ed0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
7ee0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
7ef0: 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
7f00: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
7f10: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
7f20: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
7f30: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
7f40: 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 6e  rereqRight & mUn
7f50: 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75  usable ) continu
7f60: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
7f70: 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
7f80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7f90: 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
7fa0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
7fb0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7fc0: 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
7fd0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7fe0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
7ff0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8000: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8010: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
8020: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
8030: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8040: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
8050: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
8060: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
8070: 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53  L|WO_EQUIV|WO_IS
8080: 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
8090: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
80a0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
80b0: 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
80c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
80d0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
80e0: 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 70  n>=(-1) );.    p
80f0: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
8100: 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
8110: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  ftColumn;.    pI
8120: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
8130: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f  ffset = i;.    o
8140: 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
8150: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
8160: 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  L;.    if( op==W
8170: 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45  O_IN ) op = WO_E
8180: 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  Q;.    if( op==W
8190: 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 20  O_MATCH ){.     
81a0: 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61   op = pTerm->eMa
81b0: 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  tchOp;.    }.   
81c0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
81d0: 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
81e0: 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
81f0: 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
8200: 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
8210: 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
8220: 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
8230: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
8240: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
8250: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
8260: 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
8270: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
8280: 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
8290: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
82a0: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
82b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
82c0: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
82d0: 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
82e0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
82f0: 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
8300: 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
8310: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8320: 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
8330: 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
8340: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8350: 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
8360: 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
8370: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
8380: 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
8390: 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
83a0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
83b0: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
83c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
83d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
83e0: 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
83f0: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
8400: 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
8410: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 20 26 20  ;..    if( op & 
8420: 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  (WO_LT|WO_LE|WO_
8430: 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20 26  GT|WO_GE).     &
8440: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  & sqlite3ExprIsV
8450: 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78  ector(pTerm->pEx
8460: 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20 20 20  pr->pRight) .   
8470: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c   ){.      if( i<
8480: 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20  16 ) mNoOmit |= 
8490: 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20 20  (1 << i);.      
84a0: 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20  if( op==WO_LT ) 
84b0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
84c0: 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 69 66   WO_LE;.      if
84d0: 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49  ( op==WO_GT ) pI
84e0: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57  dxCons[j].op = W
84f0: 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  O_GE;.    }..   
8500: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
8510: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
8520: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
8530: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
8540: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
8550: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
8560: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
8570: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
8580: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
8590: 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
85a0: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
85b0: 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74    }..  *pmNoOmit
85c0: 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65   = mNoOmit;.  re
85d0: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d  turn pIdxInfo;.}
85e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ../*.** The tabl
85f0: 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  e object referen
8600: 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ce passed as the
8610: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8620: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
8630: 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73  n.** must repres
8640: 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  ent a virtual ta
8650: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
8660: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78  on invokes the x
8670: 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d  BestIndex().** m
8680: 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
8690: 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20  tual table with 
86a0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
86b0: 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  x_info object th
86c0: 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61  at.** comes in a
86d0: 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d 65  s the 3rd argume
86e0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
86f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
8700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
8710: 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
8720: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
8730: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
8740: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
8750: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
8760: 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
8770: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
8780: 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
8790: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
87a0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
87b0: 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
87c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
87d0: 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
87e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
87f0: 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
8800: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
8810: 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
8820: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
8830: 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
8840: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
8850: 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
8860: 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
8870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8880: 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
8890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
88a0: 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
88b0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
88c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
88d0: 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
88e0: 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
88f0: 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
8900: 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tab;.  int rc;..
8910: 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55    TRACE_IDX_INPU
8920: 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56  TS(p);.  rc = pV
8930: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
8940: 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20  estIndex(pVtab, 
8950: 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  p);.  TRACE_IDX_
8960: 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69  OUTPUTS(p);..  i
8970: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8980: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
8990: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
89a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
89b0: 46 61 75 6c 74 28 70 50 61 72 73 65 2d 3e 64 62  Fault(pParse->db
89c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
89d0: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
89e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
89f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8a00: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
8a10: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
8a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8a40: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
8a50: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
8a60: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
8a70: 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
8a80: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
8a90: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 23 69 66  ErrMsg = 0;..#if
8aa0: 20 30 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72   0.  /* This err
8ab0: 6f 72 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  or is now caught
8ac0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
8ad0: 20 20 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20    ** Search for 
8ae0: 22 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66  "xBestIndex malf
8af0: 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f 77 20 2a  unction" below *
8b00: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
8b10: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
8b20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
8b30: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
8b40: 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
8b50: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
8b60: 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
8b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8b80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8b90: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
8ba0: 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
8bb0: 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
8bc0: 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
8bd0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
8be0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
8bf0: 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
8c00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
8c10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8c20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
8c30: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
8c40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
8c50: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
8c60: 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74  timate the locat
8c70: 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75  ion of a particu
8c80: 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c  lar key among al
8c90: 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20  l keys in an.** 
8ca0: 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68  index.  Store th
8cb0: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74  e results in aSt
8cc0: 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  at as follows:.*
8cd0: 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d  *.**    aStat[0]
8ce0: 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
8cf0: 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74  r of rows less t
8d00: 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20 61  han pRec.**    a
8d10: 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74  Stat[1]      Est
8d20: 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
8d30: 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a   equal to pRec.*
8d40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8d50: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61 6d  index of the sam
8d60: 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65 20  ple that is the 
8d70: 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  smallest sample 
8d80: 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  that.** is great
8d90: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
8da0: 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20 74   to pRec. Note t
8db0: 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20 69  hat this index i
8dc0: 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a  s not an index.*
8dd0: 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d 70  * into the aSamp
8de0: 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74 20  le[] array - it 
8df0: 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f  is an index into
8e00: 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20 6f   a virtual set o
8e10: 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73  f samples.** bas
8e20: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
8e30: 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20  ts of aSample[] 
8e40: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
8e50: 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63 6f  f fields in reco
8e60: 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f  rd .** pRec. .*/
8e70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
8e80: 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61 72  eKeyStats(.  Par
8e90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8eb0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
8ec0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
8ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8ee0: 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e   /* Index to con
8ef0: 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20  sider domain of 
8f00: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
8f10: 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20 20  ord *pRec,      
8f20: 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76 61   /* Vector of va
8f30: 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  lues to consider
8f40: 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55   */.  int roundU
8f50: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8f60: 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66    /* Round up if
8f70: 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f   true.  Round do
8f80: 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20  wn if false */. 
8f90: 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20   tRowcnt *aStat 
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fb0: 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74  OUT: stats writt
8fc0: 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  en here */.){.  
8fd0: 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
8fe0: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
8ff0: 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  mple;.  int iCol
9000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9010: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
9020: 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20 69  required stats i
9030: 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f  n anEq[] etc. */
9040: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9060: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
9070: 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20   sample >= pRec 
9080: 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65  */.  int iSample
9090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
90a0: 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d   /* Smallest sam
90b0: 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ple larger than 
90c0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63  or equal to pRec
90d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d   */.  int iMin =
90e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
90f0: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
9100: 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65 73  mple not yet tes
9110: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ted */.  int iTe
9120: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9130: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d       /* Next sam
9140: 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ple to test */. 
9150: 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9170: 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  Result of compar
9180: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
9190: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
91c0: 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20  lds in pRec */. 
91d0: 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20   tRowcnt iLower 
91e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
91f0: 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20  anLt[] + anEq[] 
9200: 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70 6c  of largest sampl
9210: 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a  e pRec is > */..
9220: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
9230: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
9240: 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65 20  RAMETER( pParse 
9250: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
9260: 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a 20  rt( pRec!=0 );. 
9270: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9280: 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
9290: 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69 65  sert( pRec->nFie
92a0: 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e 46  ld>0 && pRec->nF
92b0: 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d  ield<=pIdx->nSam
92c0: 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20  pleCol );..  /* 
92d0: 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72  Do a binary sear
92e0: 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66  ch to find the f
92f0: 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65 61  irst sample grea
9300: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
9310: 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20  l.  ** to pRec. 
9320: 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73  If pRec contains
9330: 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c   a single field,
9340: 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70   the set of samp
9350: 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20 20  les to search.  
9360: 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68 65  ** is simply the
9370: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
9380: 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65 73  . If the samples
9390: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f   in aSample[] co
93a0: 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20  ntain more.  ** 
93b0: 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c  than one fields,
93c0: 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c   all fields foll
93d0: 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  owing the first 
93e0: 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a  are ignored..  *
93f0: 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20 63  *.  ** If pRec c
9400: 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73  ontains N fields
9410: 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f 72  , where N is mor
9420: 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e  e than one, then
9430: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 0a   as well as the.
9440: 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20    ** samples in 
9450: 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63  aSample[] (trunc
9460: 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64 73  ated to N fields
9470: 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61 6c  ), the search al
9480: 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63  so has to.  ** c
9490: 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65 73  onsider prefixes
94a0: 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c 65   of those sample
94b0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
94c0: 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73 61  if the set of sa
94d0: 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53  mples.  ** in aS
94e0: 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20  ample is:.  **. 
94f0: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
9500: 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a  0] = (a, 5) .  *
9510: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d  *     aSample[1]
9520: 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a   = (a, 10) .  **
9530: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20       aSample[2] 
9540: 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (b, 5) .  **  
9550: 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20     aSample[3] = 
9560: 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20  (c, 100) .  **  
9570: 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20     aSample[4] = 
9580: 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20  (c, 105).  **.  
9590: 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61 72  ** Then the sear
95a0: 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64 20  ch space should 
95b0: 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20 73  ideally be the s
95c0: 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e 64  amples above and
95d0: 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75   the .  ** uniqu
95e0: 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c 20  e prefixes [a], 
95f0: 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74  [b] and [c]. But
9600: 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20 68   since that is h
9610: 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c  ard to organize,
9620: 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 20   .  ** the code 
9630: 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68 65  actually searche
9640: 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a  s this set:.  **
9650: 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61 29  .  **     0: (a)
9660: 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28 61   .  **     1: (a
9670: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 32  , 5) .  **     2
9680: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
9690: 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20 0a      3: (a, 10) .
96a0: 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29 20    **     4: (b) 
96b0: 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c  .  **     5: (b,
96c0: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a   5) .  **     6:
96d0: 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20 37   (c) .  **     7
96e0: 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a  : (c, 100) .  **
96f0: 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35 29       8: (c, 105)
9700: 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c  .  **     9: (c,
9710: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
9720: 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65 20  For each sample 
9730: 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  in the aSample[]
9740: 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65   array, N sample
9750: 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  s are present in
9760: 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63 74   the.  ** effect
9770: 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61 79  ive sample array
9780: 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  . In the above, 
9790: 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31 20  samples 0 and 1 
97a0: 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20 20  are based on .  
97b0: 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c  ** sample aSampl
97c0: 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20  e[0]. Samples 2 
97d0: 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65  and 3 on aSample
97e0: 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20  [1] etc..  **.  
97f0: 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65  ** Often, sample
9800: 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b   i of each block
9810: 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65 20   of N effective 
9820: 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b 31  samples has (i+1
9830: 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45  ) fields..  ** E
9840: 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d 70  xcept, each samp
9850: 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e 64  le may be extend
9860: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
9870: 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72 20  t it is greater 
9880: 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75  than or.  ** equ
9890: 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  al to the previo
98a0: 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65  us sample in the
98b0: 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61 6d   array. For exam
98c0: 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f 76  ple, in the abov
98d0: 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20  e, .  ** sample 
98e0: 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  2 is the first s
98f0: 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b  ample of a block
9900: 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73   of N samples, s
9910: 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a 20  o at first it . 
9920: 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61 74   ** appears that
9930: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31 20   it should be 1 
9940: 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48  field in size. H
9950: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f 75  owever, that wou
9960: 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a  ld make it .  **
9970: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61   smaller than sa
9980: 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20 62  mple 1, so the b
9990: 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f 75  inary search wou
99a0: 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20  ld not work. As 
99b0: 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20  a result, .  ** 
99c0: 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20 74  it is extended t
99d0: 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54 68  o two fields. Th
99e0: 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68 61  e duplicates tha
99f0: 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20 64  t this creates d
9a00: 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73  o not .  ** caus
9a10: 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
9a20: 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20    */.  nField = 
9a30: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  pRec->nField;.  
9a40: 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d  iCol = 0;.  iSam
9a50: 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d  ple = pIdx->nSam
9a60: 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20  ple * nField;.  
9a70: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61 6d  do{.    int iSam
9a80: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9a90: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
9aa0: 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74  n aSample[] of t
9ab0: 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20  est sample */.  
9ac0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 65  /* Number of fie
9af0: 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d 70  lds in test samp
9b00: 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74  le */..    iTest
9b10: 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65   = (iMin+iSample
9b20: 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d  )/2;.    iSamp =
9b30: 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b   iTest / nField;
9b40: 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e 30  .    if( iSamp>0
9b50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
9b60: 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63 74   proposed effect
9b70: 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61 20  ive sample is a 
9b80: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
9b90: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9ba0: 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69 66  .      ** Specif
9bb0: 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72  ically, the shor
9bc0: 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 61  test prefix of a
9bd0: 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54 65  t least (1 + iTe
9be0: 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20 20  st%nField) .    
9bf0: 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74    ** fields that
9c00: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
9c10: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 66   the previous ef
9c20: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e 20  fective sample. 
9c30: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d   */.      for(n=
9c40: 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64 29  (iTest % nField)
9c50: 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20   + 1; n<nField; 
9c60: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  n++){.        if
9c70: 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d  ( aSample[iSamp-
9c80: 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53  1].anLt[n-1]!=aS
9c90: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9ca0: 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a  t[n-1] ) break;.
9cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
9cc0: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54 65  e{.      n = iTe
9cd0: 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  st + 1;.    }.. 
9ce0: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
9cf0: 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20 73  = n;.    res = s
9d00: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
9d10: 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
9d20: 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c  iSamp].n, aSampl
9d30: 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63  e[iSamp].p, pRec
9d40: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  );.    if( res<0
9d50: 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
9d60: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70   = aSample[iSamp
9d70: 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53  ].anLt[n-1] + aS
9d80: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45  ample[iSamp].anE
9d90: 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  q[n-1];.      iM
9da0: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
9db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d    }else if( res=
9dc0: 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29  =0 && n<nField )
9dd0: 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
9de0: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9df0: 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20  anLt[n-1];.     
9e00: 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b   iMin = iTest+1;
9e10: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b  .      res = -1;
9e20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9e30: 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65 73    iSample = iTes
9e40: 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  t;.      iCol = 
9e50: 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  n-1;.    }.  }wh
9e60: 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e  ile( res && iMin
9e70: 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20  <iSample );.  i 
9e80: 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65  = iSample / nFie
9e90: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
9ea0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
9eb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
9ec0: 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63 68  rt statements ch
9ed0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69 6e  eck that the bin
9ee0: 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65 0a  ary search code.
9ef0: 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64    ** above found
9f00: 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77 65   the right answe
9f10: 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  r. This block se
9f20: 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65 20  rves no purpose 
9f30: 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  other.  ** than 
9f40: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 73  to invoke the as
9f50: 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28  serts.  */.  if(
9f60: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9f70: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
9f80: 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
9f90: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28 72  {.      /* If (r
9fa0: 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20  es==0) is true, 
9fb0: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 62  then pRec must b
9fc0: 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c  e equal to sampl
9fd0: 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  e i. */.      as
9fe0: 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
9ff0: 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 61  ample );.      a
a000: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
a010: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  eld-1 );.      p
a020: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
a030: 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73 65  ield;.      asse
a040: 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64  rt( 0==sqlite3Vd
a050: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
a060: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
a070: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
a080: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a090: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a0a0: 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20 20  locFailed .     
a0b0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
a0c0: 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69       /* Unless i
a0d0: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
a0e0: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
a0f0: 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72 20   pRec is larger 
a100: 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c  than.      ** al
a110: 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  l samples in the
a120: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
a130: 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 73  , pRec must be s
a140: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a  maller than the.
a150: 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31        ** (iCol+1
a160: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
a170: 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a  f sample i.  */.
a180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
a190: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26  =pIdx->nSample &
a1a0: 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  & i>=0 );.      
a1b0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69  pRec->nField = i
a1c0: 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  Col+1;.      ass
a1d0: 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  ert( i==pIdx->nS
a1e0: 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20  ample .         
a1f0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
a200: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
a210: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
a220: 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e  ple[i].p, pRec)>
a230: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
a240: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
a250: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20  ocFailed );..   
a260: 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e     /* if i==0 an
a270: 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20  d iCol==0, then 
a280: 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 73  record pRec is s
a290: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20  maller than all 
a2a0: 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a  samples.      **
a2b0: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
a2c0: 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  ] array. Otherwi
a2d0: 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29 20  se, if (iCol>0) 
a2e0: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a 20  then pRec must. 
a2f0: 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61 74       ** be great
a300: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
a310: 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20 66   to the (iCol) f
a320: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
a330: 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a  ample i..      *
a340: 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65 6e  * If (i>0), then
a350: 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f 20   pRec must also 
a360: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
a370: 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a  sample (i-1).  *
a380: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  /.      if( iCol
a390: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  >0 ){.        pR
a3a0: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f  ec->nField = iCo
a3b0: 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
a3c0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  t( sqlite3VdbeRe
a3d0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
a3e0: 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
a3f0: 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30  e[i].p, pRec)<=0
a400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a410: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a420: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a430: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
a440: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  >0 ){.        pR
a450: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
a460: 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eld;.        ass
a470: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
a480: 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
a490: 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53  ample[i-1].n, aS
a4a0: 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52  ample[i-1].p, pR
a4b0: 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20 20  ec)<0.          
a4c0: 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
a4d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a4f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
a500: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a510: 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d   */..  if( res==
a520: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f  0 ){.    /* Reco
a530: 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61 6c  rd pRec is equal
a540: 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a   to sample i */.
a550: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
a560: 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20  ==nField-1 );.  
a570: 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61    aStat[0] = aSa
a580: 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f  mple[i].anLt[iCo
a590: 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  l];.    aStat[1]
a5a0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
a5b0: 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73  Eq[iCol];.  }els
a5c0: 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  e{.    /* At thi
a5d0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69 43  s point, the (iC
a5e0: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
a5f0: 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d  ix of aSample[i]
a600: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a 20   is the first . 
a610: 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61     ** sample tha
a620: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
a630: 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20 69  n pRec. Or, if i
a640: 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  ==pIdx->nSample 
a650: 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a  then pRec.    **
a660: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
a670: 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74  all samples in t
a680: 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  he array. */.   
a690: 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 2c   tRowcnt iUpper,
a6a0: 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69   iGap;.    if( i
a6b0: 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
a6c0: 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  ){.      iUpper 
a6d0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54  = sqlite3LogEstT
a6e0: 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77  oInt(pIdx->aiRow
a6f0: 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  LogEst[0]);.    
a700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
a710: 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  per = aSample[i]
a720: 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
a730: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f 77   }..    if( iLow
a740: 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
a750: 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20      iGap = 0;.  
a760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a770: 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Gap = iUpper - i
a780: 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Lower;.    }.   
a790: 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
a7a0: 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47        iGap = (iG
a7b0: 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c  ap*2)/3;.    }el
a7c0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
a7d0: 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20   iGap/3;.    }. 
a7e0: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c     aStat[0] = iL
a7f0: 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 20  ower + iGap;.   
a800: 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78   aStat[1] = pIdx
a810: 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a  ->aAvgEq[iCol];.
a820: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72    }..  /* Restor
a830: 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65  e the pRec->nFie
a840: 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ld value before 
a850: 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20  returning.  */. 
a860: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
a870: 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e  nField;.  return
a880: 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   i;.}.#endif /* 
a890: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
a8a0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
a8b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
a8c0: 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20  not NULL, pTerm 
a8d0: 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70  is a term that p
a8e0: 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72  rovides an upper
a8f0: 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75   or lower.** bou
a900: 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63  nd on a range sc
a910: 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73  an. Without cons
a920: 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69  idering pTerm, i
a930: 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a  t is estimated .
a940: 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
a950: 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77   will visit nNew
a960: 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63   rows. This func
a970: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
a980: 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d   number.** estim
a990: 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  ated to be visit
a9a0: 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20  ed after taking 
a9b0: 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75  pTerm into accou
a9c0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
a9d0: 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79   user explicitly
a9e0: 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b   specified a lik
a9f0: 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20  elihood() value 
aa00: 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a  for this term,.*
aa10: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
aa20: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c  n value is the l
aa30: 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70  ikelihood multip
aa40: 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  lied by the numb
aa50: 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72  er of.** input r
aa60: 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ows. Otherwise, 
aa70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
aa80: 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49  sumes that an "I
aa90: 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d  S NOT NULL" term
aaa0: 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69  .** has a likeli
aab0: 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e  hood of 0.50, an
aac0: 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d  d any other term
aad0: 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
aae0: 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63   0.25..*/.static
aaf0: 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e   LogEst whereRan
ab00: 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65  geAdjust(WhereTe
ab10: 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73  rm *pTerm, LogEs
ab20: 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73  t nNew){.  LogEs
ab30: 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  t nRet = nNew;. 
ab40: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
ab50: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
ab60: 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20  thProb<=0 ){.   
ab70: 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d     nRet += pTerm
ab80: 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
ab90: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
aba0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
abb0: 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
abc0: 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b       nRet -= 20;
abd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abe0: 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
abf0: 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t(4) );.    }.  
ac00: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
ac10: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
ac20: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ac30: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52  OR_STAT4./*.** R
ac40: 65 74 75 72 6e 20 74 68 65 20 61 66 66 69 6e 69  eturn the affini
ac50: 74 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ty for a single 
ac60: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
ac70: 65 78 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ex..*/.char sqli
ac80: 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66  te3IndexColumnAf
ac90: 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20 2a  finity(sqlite3 *
aca0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  db, Index *pIdx,
acb0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73   int iCol){.  as
acc0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
acd0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
ace0: 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21 70 49  umn );.  if( !pI
acf0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20  dx->zColAff ){. 
ad00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
ad10: 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 64  dexAffinityStr(d
ad20: 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20 72 65  b, pIdx)==0 ) re
ad30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
ad40: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
ad50: 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  rn pIdx->zColAff
ad60: 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66  [iCol];.}.#endif
ad70: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
ad80: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
ad90: 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68  _STAT4./* .** Th
ada0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
adb0: 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61 74  alled to estimat
adc0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
add0: 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
ade0: 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20  a.** range-scan 
adf0: 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  on a skip-scan i
ae00: 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ndex. For exampl
ae10: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  e:.**.**   CREAT
ae20: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
ae30: 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20  (a, b, c);.**   
ae40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
ae50: 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 63   WHERE a=? AND c
ae60: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
ae70: 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c  ;.**.** Value pL
ae80: 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72  oop->nOut is cur
ae90: 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
aea0: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
aeb0: 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76  er of rows .** v
aec0: 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e 6e  isited for scann
aed0: 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f  ing (a=? AND b=?
aee0: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
aef0: 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65 73   reduces that es
af00: 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f  timate .** by so
af10: 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63 63  me factor to acc
af20: 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63 20  ount for the (c 
af30: 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29  BETWEEN ? AND ?)
af40: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73 65   expression base
af50: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 74  d.** on the stat
af60: 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69  4 data for the i
af70: 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e 20  ndex. this scan 
af80: 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65 64  will be peformed
af90: 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
afa0: 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65 61  mes (once for ea
afb0: 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61  ch (a,b) combina
afc0: 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68 65  tion that matche
afd0: 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74 20  s a=?) is dealt 
afe0: 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65 20  with .** by the 
aff0: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  caller..**.** It
b000: 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73 63   does this by sc
b010: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
b020: 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65 73  ll stat4 samples
b030: 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75  , comparing valu
b040: 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  es.** extracted 
b050: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
b060: 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65 20  pUpper with the 
b070: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
b080: 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20  lumn in each.** 
b090: 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64  sample. If L and
b0a0: 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65   U are the numbe
b0b0: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 75  r of samples fou
b0c0: 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  nd to be less th
b0d0: 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74  an or.** equal t
b0e0: 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78 74  o the values ext
b0f0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77  racted from pLow
b100: 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
b110: 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a  spectively, and.
b120: 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74 61  ** N is the tota
b130: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  l number of samp
b140: 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e  les, the pLoop->
b150: 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61 64  nOut value is ad
b160: 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c  justed.** as fol
b170: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f  lows:.**.**   nO
b180: 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69  ut = nOut * ( mi
b190: 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20  n(U - L, 1) / N 
b1a0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65  ).**.** If pLowe
b1b0: 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
b1c0: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
b1d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
b1e0: 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a  he term, L is.**
b1f0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66   set to zero. If
b200: 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c   pUpper is NULL,
b210: 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e   or a value cann
b220: 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20  ot be extracted 
b230: 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73  from it,.** U is
b240: 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a   set to N..**.**
b250: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
b260: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70  function sets *p
b270: 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f 72  bDone to 1 befor
b280: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77  e returning. How
b290: 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76  ever,.** if no v
b2a0: 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72  alue can be extr
b2b0: 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68 65  acted from eithe
b2c0: 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70 70  r pLower or pUpp
b2d0: 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a  er (and so the.*
b2e0: 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  * estimate of th
b2f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b300: 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61 69   delivered remai
b310: 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a  ns unchanged), *
b320: 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66  pbDone.** is lef
b330: 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49  t as is..**.** I
b340: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b350: 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
b360: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
b370: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
b380: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
b390: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
b3a0: 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45  reRangeSkipScanE
b3b0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
b3c0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
b3d0: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
b3e0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
b3f0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
b400: 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
b410: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
b420: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
b430: 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
b440: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
b450: 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
b460: 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
b470: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
b480: 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
b490: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  L */.  WhereLoop
b4a0: 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55   *pLoop,    /* U
b4b0: 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74 20  pdate the .nOut 
b4c0: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c 6f  value of this lo
b4d0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  op */.  int *pbD
b4e0: 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  one          /* 
b4f0: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
b500: 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70 72  t least one expr
b510: 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65  . value extracte
b520: 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  d */.){.  Index 
b530: 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
b540: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
b550: 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
b560: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71  .btree.nEq;.  sq
b570: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b580: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c  se->db;.  int nL
b590: 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  ower = -1;.  int
b5a0: 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61   nUpper = p->nSa
b5b0: 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63  mple+1;.  int rc
b5c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b5d0: 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  u8 aff = sqlite3
b5e0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e  IndexColumnAffin
b5f0: 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b  ity(db, p, nEq);
b600: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
b610: 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  l;.  .  sqlite3_
b620: 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20  value *p1 = 0;  
b630: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
b640: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b650: 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69  pLower */.  sqli
b660: 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20  te3_value *p2 = 
b670: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
b680: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
b690: 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20  rom pUpper */.  
b6a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
b6b0: 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Val = 0;        
b6c0: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
b6d0: 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a  ed from record *
b6e0: 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  /..  pColl = sql
b6f0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
b700: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43  q(pParse, p->azC
b710: 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28  oll[nEq]);.  if(
b720: 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72   pLower ){.    r
b730: 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
b740: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
b750: 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45  arse, pLower->pE
b760: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
b770: 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77  , &p1);.    nLow
b780: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  er = 0;.  }.  if
b790: 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d  ( pUpper && rc==
b7a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b7b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
b7c0: 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
b7d0: 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e  pParse, pUpper->
b7e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
b7f0: 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55  ff, &p2);.    nU
b800: 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20  pper = p2 ? 0 : 
b810: 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a  p->nSample;.  }.
b820: 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20  .  if( p1 || p2 
b830: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
b840: 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20    int nDiff;.   
b850: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
b860: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e  LITE_OK && i<p->
b870: 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
b880: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b890: 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c  3Stat4Column(db,
b8a0: 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70   p->aSample[i].p
b8b0: 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
b8c0: 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a  n, nEq, &pVal);.
b8d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b8e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b  LITE_OK && p1 ){
b8f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
b900: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
b910: 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70  pare(p1, pVal, p
b920: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
b930: 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77  f( res>=0 ) nLow
b940: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b950: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b960: 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20  TE_OK && p2 ){. 
b970: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
b980: 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
b990: 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f  re(p2, pVal, pCo
b9a0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
b9b0: 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72   res>=0 ) nUpper
b9c0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
b9d0: 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e  }.    nDiff = (n
b9e0: 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b  Upper - nLower);
b9f0: 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d  .    if( nDiff<=
ba00: 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a  0 ) nDiff = 1;..
ba10: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
ba20: 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
ba30: 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
ba40: 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20   specified, and 
ba50: 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  the .    ** comp
ba60: 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65  arisons indicate
ba70: 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
ba80: 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75  lose together, u
ba90: 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a  se the fallback.
baa0: 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61      ** method (a
bab0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
bac0: 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20  can visits 1/64 
bad0: 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72  of the rows) for
bae0: 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20   estimating.    
baf0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
bb00: 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f   rows visited. O
bb10: 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61  therwise, estima
bb20: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
bb30: 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69   rows.    ** usi
bb40: 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  ng the method de
bb50: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 68  scribed in the h
bb60: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f  eader comment fo
bb70: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
bb80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66   */.    if( nDif
bb90: 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d  f!=1 || pUpper==
bba0: 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29  0 || pLower==0 )
bbb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a  {.      int nAdj
bbc0: 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f  ust = (sqlite3Lo
bbd0: 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29  gEst(p->nSample)
bbe0: 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   - sqlite3LogEst
bbf0: 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20  (nDiff));.      
bc00: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e  pLoop->nOut -= n
bc10: 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70  Adjust;.      *p
bc20: 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
bc30: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
bc40: 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73  , ("range skip-s
bc50: 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e  can regions: %u.
bc60: 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65  .%u  adjust=%d e
bc70: 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70       nLower, nUp
bca0: 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c  per, nAdjust*-1,
bcb0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a   pLoop->nOut));.
bcc0: 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
bcd0: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62 44      assert( *pbD
bce0: 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  one==0 );.  }.. 
bcf0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
bd00: 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p1);.  sqlite3
bd10: 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20  ValueFree(p2);. 
bd20: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
bd30: 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
bd40: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
bd50: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
bd60: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
bd70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
bd80: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
bd90: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
bda0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
bdb0: 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
bdc0: 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
bdd0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
bde0: 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
bdf0: 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
be00: 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
be10: 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
be20: 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
be30: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
be40: 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
be50: 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
be60: 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
be70: 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
be80: 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
be90: 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
bea0: 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
beb0: 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
bec0: 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
bed0: 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
bee0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
bef0: 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
bf00: 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
bf10: 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
bf20: 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
bf50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bf60: 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
bf70: 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
bf80: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
bf90: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
bfa0: 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
bfb0: 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
bfc0: 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
bfd0: 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
bfe0: 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
bff0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
c000: 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
c010: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
c020: 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62  nEq) is the numb
c030: 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  er of the index.
c040: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ** column subjec
c050: 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63  t to the range c
c060: 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
c070: 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
c080: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71   number of.** eq
c090: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
c0a0: 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ts optimized by 
c0b0: 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
c0c0: 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
c0d0: 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e  mple,.** assumin
c0e0: 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  g index p is on 
c0f0: 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
c100: 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
c110: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
c120: 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
c130: 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
c140: 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
c150: 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
c160: 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
c170: 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
c180: 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65  mn, b, is the se
c190: 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  cond .** left-mo
c1a0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
c1b0: 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
c1c0: 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
c1d0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
c1e0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
c1f0: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
c200: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
c210: 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  t to 0..**.** Wh
c220: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c230: 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f   is called, *pnO
c240: 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
c250: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29   sqlite3LogEst()
c260: 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
c270: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74  r of rows that t
c280: 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  he index scan is
c290: 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
c2a0: 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63  it without .** c
c2b0: 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72  onsidering the r
c2c0: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
c2d0: 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74  . If nEq is 0, t
c2e0: 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68  hen *pnOut is th
c2f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
c300: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
c310: 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  x. Assuming no e
c320: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e  rror occurs, *pn
c330: 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20  Out is adjusted 
c340: 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20  (reduced).** to 
c350: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
c360: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
c370: 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
c380: 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
c390: 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
c3a0: 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
c3b0: 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
c3c0: 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
c3d0: 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69  be.** used, a si
c3e0: 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75  ngle range inequ
c3f0: 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
c400: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
c410: 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e  y a factor of 4.
c420: 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20   .** and a pair 
c430: 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  of constraints (
c440: 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64  x>? AND x<?) red
c450: 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65  uces the expecte
c460: 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72  d number of.** r
c470: 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61  ows visited by a
c480: 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a   factor of 64..*
c490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
c4a0: 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
c4b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c4c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c4d0: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
c4e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c4f0: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
c500: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57  r *pBuilder,.  W
c510: 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
c520: 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
c530: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
c540: 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
c550: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c560: 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
c570: 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
c580: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
c590: 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
c5a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c5b0: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
c5c0: 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20  p     /* Modify 
c5d0: 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61  the .nOut and ma
c5e0: 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73  ybe .rRun fields
c5f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
c600: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c610: 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d  nt nOut = pLoop-
c620: 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20  >nOut;.  LogEst 
c630: 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
c640: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
c650: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64  3_OR_STAT4.  Ind
c660: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
c670: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
c680: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
c690: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a  ->u.btree.nEq;..
c6a0: 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
c6b0: 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61  >0 && nEq<p->nSa
c6c0: 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69  mpleCol ){.    i
c6d0: 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  f( nEq==pBuilder
c6e0: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20  ->nRecValid ){. 
c6f0: 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63       UnpackedRec
c700: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
c710: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
c720: 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
c730: 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d        int nBtm =
c740: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
c750: 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nBtm;.      int 
c760: 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  nTop = pLoop->u.
c770: 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20  btree.nTop;..   
c780: 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
c790: 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73 65  Lower will be se
c7a0: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
c7b0: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
c7c0: 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20 20  of rows in .    
c7d0: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74    ** the index t
c7e0: 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68 61  hat are less tha
c7f0: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
c800: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71  d of the range q
c810: 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20 20  uery. The.      
c820: 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62  ** lower bound b
c830: 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74 65  eing the concate
c840: 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64  nation of $P and
c850: 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69 73   $L, where $P is
c860: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65   the.      ** ke
c870: 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64 20  y-prefix formed 
c880: 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  by the nEq value
c890: 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  s matched agains
c8a0: 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d  t the nEq left-m
c8b0: 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  ost.      ** col
c8c0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
c8d0: 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68 65  x, and $L is the
c8e0: 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72   value in pLower
c8f0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c900: 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65   ** Or, if pLowe
c910: 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20  r is NULL or $L 
c920: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
c930: 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65 63  ted from it (bec
c940: 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a 2a  ause it.      **
c950: 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
c960: 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74   variable or lit
c970: 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65  eral value), the
c980: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
c990: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e  the.      ** ran
c9a0: 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74 6f  ge is $P. Due to
c9b0: 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65 20   a quirk in the 
c9c0: 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61 74  way whereKeyStat
c9d0: 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a  s() works, even.
c9e0: 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20 69        ** if $L i
c9f0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68 65  s available, whe
ca00: 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73 20  reKeyStats() is 
ca10: 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68 20  called for both 
ca20: 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20 20  ($P) and .      
ca30: 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20 74  ** ($P:$L) and t
ca40: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
ca50: 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76 61   two returned va
ca60: 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20 20  lues is used..  
ca70: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ca80: 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70 65  Similarly, iUppe
ca90: 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20 74  r is to be set t
caa0: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
cab0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
cac0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  rows.      ** le
cad0: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
cae0: 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
caf0: 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
cb00: 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
cb10: 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  d.      ** is ei
cb20: 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24 50  ther ($P) or ($P
cb30: 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65  :$U). Again, eve
cb40: 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69 6c  n if $U is avail
cb50: 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65  able, both value
cb60: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69 55  s.      ** of iU
cb70: 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73 74  pper are request
cb80: 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53 74  ed of whereKeySt
cb90: 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73 6d  ats() and the sm
cba0: 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20 20  aller used..    
cbb0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
cbc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
cbd0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
cbe0: 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e 20   bounds is then 
cbf0: 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f 77  just iUpper-iLow
cc00: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
cc10: 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
cc20: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
cc30: 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77  ess than the low
cc40: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
cc50: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
cc60: 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65  ;     /* Rows le
cc70: 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
cc80: 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
cc90: 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20 2d   int iLwrIdx = -
cca0: 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  2;   /* aSample[
ccb0: 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72 20  ] for the lower 
ccc0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
ccd0: 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31 3b  nt iUprIdx = -1;
cce0: 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20     /* aSample[] 
ccf0: 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62 6f  for the upper bo
cd00: 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  und */..      if
cd10: 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20  ( pRec ){.      
cd20: 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65 63    testcase( pRec
cd30: 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c 64  ->nField!=pBuild
cd40: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b  er->nRecValid );
cd50: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
cd60: 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65 72  Field = pBuilder
cd70: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 20  ->nRecValid;.   
cd80: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
cd90: 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
cda0: 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
cdb0: 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
cdc0: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
cdd0: 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
cde0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
cdf0: 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
ce00: 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
ce10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
ce20: 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
ce30: 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
ce40: 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
ce50: 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
ce60: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
ce70: 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
ce80: 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
ce90: 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
cea0: 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
ceb0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
cec0: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
ced0: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
cee0: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
cef0: 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
cf00: 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
cf10: 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
cf20: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
cf30: 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
cf40: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
cf50: 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
cf60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cf70: 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
cf80: 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
cf90: 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
cfa0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
cfb0: 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
cfc0: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
cfd0: 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
cfe0: 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
cff0: 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
d000: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
d010: 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
d020: 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
d030: 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
d040: 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
d050: 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
d060: 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 6e       SWAP(int, n
d070: 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20  Btm, nTop);.    
d080: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
d090: 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
d0a0: 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72  ve on the iLower
d0b0: 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
d0c0: 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$L). */.    
d0d0: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
d0e0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20          int n;  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72    /* Values extr
d110: 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
d120: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
d130: 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
d140: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
d150: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d160: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
d170: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
d180: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
d190: 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b   nBtm, nEq, &n);
d1a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
d1b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20  =SQLITE_OK && n 
d1c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
d1d0: 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
d1e0: 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20       u16 mask = 
d1f0: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_GT|WO_LE;.   
d200: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
d210: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d220: 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b  (pExpr)>n ) mask
d230: 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29   = (WO_LE|WO_LT)
d240: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72  ;.          iLwr
d250: 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
d260: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
d270: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
d280: 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
d290: 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
d2a0: 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20  perator & mask) 
d2b0: 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20  ? a[1] : 0);.   
d2c0: 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e         if( iNew>
d2d0: 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20  iLower ) iLower 
d2e0: 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = iNew;.        
d2f0: 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20    nOut--;.      
d300: 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a      pLower = 0;.
d310: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d320: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
d330: 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65  ossible, improve
d340: 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20 65   on the iUpper e
d350: 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24  stimate using ($
d360: 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20  P:$U). */.      
d370: 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20  if( pUpper ){.  
d380: 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63  /* Values extrac
d3b0: 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a  ted from pExpr *
d3c0: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
d3d0: 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
d3e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
d3f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d400: 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74  te3Stat4ProbeSet
d410: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c  Value(pParse, p,
d420: 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e   &pRec, pExpr, n
d430: 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20  Top, nEq, &n);. 
d440: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
d450: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b  QLITE_OK && n ){
d460: 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63  .          tRowc
d470: 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20  nt iNew;.       
d480: 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f     u16 mask = WO
d490: 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _GT|WO_LE;.     
d4a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d4b0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
d4c0: 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d  Expr)>n ) mask =
d4d0: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a   (WO_LE|WO_LT);.
d4e0: 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49 64            iUprId
d4f0: 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74  x = whereKeyStat
d500: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65  s(pParse, p, pRe
d510: 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20 20  c, 1, a);.      
d520: 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20      iNew = a[0] 
d530: 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  + ((pUpper->eOpe
d540: 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20  rator & mask) ? 
d550: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d560: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55       if( iNew<iU
d570: 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20  pper ) iUpper = 
d580: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d590: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d5a0: 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20    pUpper = 0;.  
d5b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d5c0: 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
d5d0: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
d5e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d5f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d600: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
d610: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
d620: 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nNew = sqlite3Lo
d630: 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  gEst(iUpper - iL
d640: 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ower);.         
d650: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20   /* TUNING:  If 
d660: 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20  both iUpper and 
d670: 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76  iLower are deriv
d680: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ed from the same
d690: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
d6a0: 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  mple, then assum
d6b0: 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f  e they are 4x mo
d6c0: 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54  re selective.  T
d6d0: 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20  his brings.     
d6e0: 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69       ** the esti
d6f0: 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74  mated selectivit
d700: 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77  y more in line w
d710: 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c  ith what it woul
d720: 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  d be.          *
d730: 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77  * if estimated w
d740: 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f  ithout the use o
d750: 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73  f STAT3/4 tables
d760: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
d770: 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72  f( iLwrIdx==iUpr
d780: 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30  Idx ) nNew -= 20
d790: 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73  ;  assert( 20==s
d7a0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
d7b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d7c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77  {.          nNew
d7d0: 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73   = 10;        as
d7e0: 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
d7f0: 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
d800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d810: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b  if( nNew<nOut ){
d820: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20  .          nOut 
d830: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
d840: 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  }.        WHERET
d850: 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41  RACE(0x10, ("STA
d860: 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25  T4 range scan: %
d870: 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22  u..%u  est=%d\n"
d880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
d8a0: 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69  2)iLower, (u32)i
d8b0: 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20  Upper, nOut));. 
d8c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d8d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e  {.      int bDon
d8e0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
d8f0: 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  = whereRangeSkip
d900: 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
d910: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20  pLower, pUpper, 
d920: 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a  pLoop, &bDone);.
d930: 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20        if( bDone 
d940: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d950: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
d960: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d970: 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45  pParse);.  UNUSE
d980: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69  D_PARAMETER(pBui
d990: 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  lder);.  assert(
d9a0: 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
d9b0: 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  r );.#endif.  as
d9c0: 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20  sert( pUpper==0 
d9d0: 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c  || (pUpper->wtFl
d9e0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
d9f0: 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d  )==0 );.  nNew =
da00: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
da10: 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b  t(pLower, nOut);
da20: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
da30: 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65  angeAdjust(pUppe
da40: 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20  r, nNew);..  /* 
da50: 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65  TUNING: If there
da60: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
da70: 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69  r and lower limi
da80: 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69  t and neither li
da90: 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20  mit.  ** has an 
daa0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
dab0: 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  ned likelihood()
dac0: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e  , assume the ran
dad0: 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63  ge is.  ** reduc
dae0: 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f  ed by an additio
daf0: 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65  nal 75%. This me
db00: 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66  ans that, by def
db10: 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e  ault, an open-en
db20: 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71  ded.  ** range q
db30: 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e  uery (e.g. col >
db40: 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74   ?) is assumed t
db50: 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74  o match 1/4 of t
db60: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  he rows in the. 
db70: 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65   ** index. While
db80: 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20   a closed range 
db90: 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45  (e.g. col BETWEE
dba0: 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73  N ? AND ?) is es
dbb0: 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  timated to.  ** 
dbc0: 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68  match 1/64 of th
dbd0: 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69  e index. */ .  i
dbe0: 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f  f( pLower && pLo
dbf0: 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  wer->truthProb>0
dc00: 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55   && pUpper && pU
dc10: 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  pper->truthProb>
dc20: 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d  0 ){.    nNew -=
dc30: 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74   20;.  }..  nOut
dc40: 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20   -= (pLower!=0) 
dc50: 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20  + (pUpper!=0);. 
dc60: 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e   if( nNew<10 ) n
dc70: 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20  New = 10;.  if( 
dc80: 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74  nNew<nOut ) nOut
dc90: 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66   = nNew;.#if def
dca0: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
dcb0: 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70  ENABLED).  if( p
dcc0: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  Loop->nOut>nOut 
dcd0: 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
dce0: 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73  E(0x10,("Range s
dcf0: 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20  can lowers nOut 
dd00: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
dd10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd20: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
dd30: 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23  t, nOut));.  }.#
dd40: 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e  endif.  pLoop->n
dd50: 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f  Out = (LogEst)nO
dd60: 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut;.  return rc;
dd70: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
dd80: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
dd90: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
dda0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
ddb0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
ddc0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
ddd0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
dde0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
ddf0: 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
de00: 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
de10: 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
de20: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
de30: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
de40: 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
de50: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
de60: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
de70: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
de80: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
de90: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
dea0: 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
deb0: 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
dec0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
ded0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
dee0: 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
def0: 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
df00: 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
df10: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
df20: 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
df30: 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
df40: 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
df50: 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
df60: 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
df70: 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
df80: 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
df90: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
dfa0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
dfb0: 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
dfc0: 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
dfd0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
dfe0: 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
dff0: 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
e000: 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
e010: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
e020: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
e030: 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
e040: 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
e050: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
e060: 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
e070: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
e080: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
e090: 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
e0a0: 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
e0b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e0c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e0d0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e0e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e0f0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e100: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a  uilder,.  Expr *
e110: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
e120: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
e130: 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
e140: 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
e150: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
e160: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
e170: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
e180: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
e190: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
e1a0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
e1b0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
e1c0: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
e1d0: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
e1e0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
e1f0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
e200: 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d  pRec = pBuilder-
e210: 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b  >pRec;.  int rc;
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
e240: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
e250: 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e270: 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  Statistics */.  
e280: 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65  int bOk;..  asse
e290: 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20  rt( nEq>=1 );.  
e2a0: 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e  assert( nEq<=p->
e2b0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73  nColumn );.  ass
e2c0: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
e2d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e2e0: 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  p->nSample>0 );.
e2f0: 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c 64    assert( pBuild
e300: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45  er->nRecValid<nE
e310: 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61  q );..  /* If va
e320: 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  lues are not ava
e330: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66  ilable for all f
e340: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64  ields of the ind
e350: 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ex to the left. 
e360: 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c   ** of this one,
e370: 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e   no estimate can
e380: 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e   be made. Return
e390: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
e3a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c  . */.  if( pBuil
e3b0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28  der->nRecValid<(
e3c0: 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  nEq-1) ){.    re
e3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
e3e0: 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OUND;.  }..  /* 
e3f0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
e400: 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68  ization only. Th
e410: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
e420: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
e430: 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77  lue().  ** below
e440: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68   would return th
e450: 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a  e same value.  *
e460: 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e  /.  if( nEq>=p->
e470: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a  nColumn ){.    *
e480: 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  pnRow = 1;.    r
e490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e4a0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
e4b0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
e4c0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
e4d0: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
e4e0: 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  1, nEq-1, &bOk);
e4f0: 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
e500: 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
e510: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e520: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
e530: 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
e540: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
e550: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
e560: 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
e570: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
e580: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
e590: 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
e5a0: 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
e5b0: 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
e5c0: 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c  s %s(%d): %d\n",
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e5e0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45      p->zName, nE
e5f0: 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  q-1, (int)a[1]))
e600: 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31  ;.  *pnRow = a[1
e610: 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  ];.  .  return r
e620: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
e630: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
e640: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
e650: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e660: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
e670: 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
e680: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
e690: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
e6a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
e6b0: 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f  d on.** an IN co
e6c0: 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74  nstraint where t
e6d0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
e6e0: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
e6f0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69  rator.** is a li
e700: 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45  st of values.  E
e710: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
e720: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
e730: 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20  (1,2,3,4).**.** 
e740: 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
e750: 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
e760: 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
e770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
e780: 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
e790: 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
e7a0: 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
e7b0: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
e7c0: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
e7d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e7e0: 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
e7f0: 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
e800: 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
e810: 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
e820: 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
e830: 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
e840: 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
e850: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
e860: 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
e870: 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
e880: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
e890: 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
e8a0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
e8b0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
e8c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
e8d0: 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20  ereInScanEst(.  
e8e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e8f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e900: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
e910: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
e920: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
e930: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
e940: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e950: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c    /* The value l
e960: 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ist on the RHS o
e970: 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76  f "x IN (v1,v2,v
e980: 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f  3,...)" */.  tRo
e990: 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
e9a0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
e9b0: 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
e9c0: 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
e9d0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69   Index *p = pBui
e9e0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
e9f0: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36  ree.pIndex;.  i6
ea00: 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74 65  4 nRow0 = sqlite
ea10: 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e  3LogEstToInt(p->
ea20: 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b  aiRowLogEst[0]);
ea30: 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64  .  int nRecValid
ea40: 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65   = pBuilder->nRe
ea50: 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63  cValid;.  int rc
ea60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
ea70: 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
ea80: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
ea90: 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
eaa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
eab0: 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
eac0: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
ead0: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
eae0: 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
eaf0: 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
eb00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
eb10: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eb30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
eb40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
eb50: 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
eb60: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
eb70: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
eb80: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
eb90: 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b     nEst = nRow0;
eba0: 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45  .    rc = whereE
ebb0: 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
ebc0: 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c  se, pBuilder, pL
ebd0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
ebe0: 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f   &nEst);.    nRo
ebf0: 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20  wEst += nEst;.  
ec00: 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
ec10: 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69  Valid = nRecVali
ec20: 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  d;.  }..  if( rc
ec30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ec40: 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
ec50: 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73 74   nRow0 ) nRowEst
ec60: 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70   = nRow0;.    *p
ec70: 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
ec80: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
ec90: 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  x10,("IN row est
eca0: 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22  imate: est=%d\n"
ecb0: 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
ecc0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
ecd0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
ece0: 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
ecf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ed00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
ed10: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
ed20: 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57  T4 */...#ifdef W
ed30: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
ed40: 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  D./*.** Print th
ed50: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
ed60: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a  hereTerm object.
ed70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ed80: 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57 68  hereTermPrint(Wh
ed90: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
eda0: 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69 66  int iTerm){.  if
edb0: 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ( pTerm==0 ){.  
edc0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
edd0: 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64 20  intf("TERM-%-3d 
ede0: 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b  NULL\n", iTerm);
edf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
ee00: 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20  ar zType[4];.   
ee10: 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b   char zLeft[50];
ee20: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70  .    memcpy(zTyp
ee30: 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20  e, "...", 4);.  
ee40: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
ee50: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
ee60: 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d  UAL ) zType[0] =
ee70: 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'V';.    if( pT
ee80: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
ee90: 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79   WO_EQUIV  ) zTy
eea0: 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20  pe[1] = 'E';.   
eeb0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
eec0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
eed0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
eee0: 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27  ) zType[2] = 'L'
eef0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
ef00: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
ef10: 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20  SINGLE ){.      
ef20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ef30: 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a  (sizeof(zLeft),z
ef40: 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25  Left,"left={%d:%
ef50: 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72              pTer
ef70: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20 70  m->leftCursor, p
ef80: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
ef90: 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  mn);.    }else i
efa0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
efb0: 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
efc0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   && pTerm->u.pOr
efd0: 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20  Info!=0 ){.     
efe0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
eff0: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
f000: 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62 6c 65  zLeft,"indexable
f010: 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20  =0x%lld", .     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
f040: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a  fo->indexable);.
f050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f060: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f070: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
f080: 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c  zLeft,"left=%d",
f090: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
f0a0: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  or);.    }.    s
f0b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f0c0: 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d 2d  f(.       "TERM-
f0d0: 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31 32 73  %-3d %p %s %-12s
f0e0: 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78   prob=%-3d op=0x
f0f0: 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25  %03x wtFlags=0x%
f100: 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69 54 65  04x",.       iTe
f110: 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65  rm, pTerm, zType
f120: 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e  , zLeft, pTerm->
f130: 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20  truthProb,.     
f140: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
f150: 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  or, pTerm->wtFla
f160: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  gs);.    if( pTe
f170: 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20  rm->iField ){.  
f180: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f190: 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c 64 3d  Printf(" iField=
f1a0: 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46  %d\n", pTerm->iF
f1b0: 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ield);.    }else
f1c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f1d0: 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
f1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f1f0: 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
f200: 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  0, pTerm->pExpr,
f210: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   0);.  }.}.#endi
f220: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
f230: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
f240: 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70  ** Show the comp
f250: 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
f260: 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f  a WhereClause.*/
f270: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
f280: 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 57 68  reClausePrint(Wh
f290: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
f2a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
f2b0: 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  i=0; i<pWC->nTer
f2c0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65  m; i++){.    whe
f2d0: 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70 57 43  reTermPrint(&pWC
f2e0: 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a  ->a[i], i);.  }.
f2f0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
f300: 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
f310: 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
f320: 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
f330: 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
f340: 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
f350: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f360: 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
f370: 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
f380: 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
f390: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
f3a0: 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
f3b0: 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
f3c0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
f3d0: 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63 74 20  +3)/4;.  struct 
f3e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
f3f0: 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
f400: 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
f410: 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
f420: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
f430: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c  ;.  Bitmask mAll
f440: 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   = (((Bitmask)1)
f450: 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20  <<(nb*4)) - 1;. 
f460: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
f470: 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c  ntf("%c%2d.%0*ll
f480: 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49  x.%0*llx", p->cI
f490: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
f4a0: 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c          p->iTab,
f4b0: 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66   nb, p->maskSelf
f4c0: 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 20  , nb, p->prereq 
f4d0: 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  & mAll);.  sqlit
f4e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f4f0: 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %12s",.         
f500: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
f510: 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65  m->zAlias ? pIte
f520: 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62  m->zAlias : pTab
f530: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
f540: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
f550: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
f560: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
f570: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
f580: 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
f590: 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61  e.pIndex && (zNa
f5a0: 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
f5b0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d  pIndex->zName)!=
f5c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
f5d0: 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  trncmp(zName, "s
f5e0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
f5f0: 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
f600: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c       int i = sql
f610: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
f620: 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  me) - 1;.       
f630: 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d   while( zName[i]
f640: 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20  !='_' ) i--;.   
f650: 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b       zName += i;
f660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f670: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f680: 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20  f(".%-16s %2d", 
f690: 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65  zName, p->u.btre
f6a0: 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73  e.nEq);.    }els
f6b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f6c0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30  DebugPrintf("%20
f6d0: 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20  s","");.    }.  
f6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
f6f0: 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  *z;.    if( p->u
f700: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a  .vtab.idxStr ){.
f710: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
f720: 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c  3_mprintf("(%d,\
f730: 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20  "%s\",%x)",.    
f740: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75              p->u
f750: 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d  .vtab.idxNum, p-
f760: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20  >u.vtab.idxStr, 
f770: 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
f780: 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sk);.    }else{.
f790: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
f7a0: 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25  3_mprintf("(%d,%
f7b0: 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69  x)", p->u.vtab.i
f7c0: 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
f7d0: 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20  .omitMask);.    
f7e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
f7f0: 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73  ugPrintf(" %-19s
f800: 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", z);.    sqlit
f810: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
f820: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
f830: 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
f840: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
f850: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20  DebugPrintf(" f 
f860: 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e  %05x %d-%d", p->
f870: 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
f880: 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20  rm,p->nSkip);.  
f890: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
f8a0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f8b0: 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d  f %05x N %d", p-
f8c0: 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
f8d0: 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  erm);.  }.  sqli
f8e0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f8f0: 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e   cost %d,%d,%d\n
f900: 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d  ", p->rSetup, p-
f910: 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b  >rRun, p->nOut);
f920: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d  .  if( p->nLTerm
f930: 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72   && (sqlite3Wher
f940: 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21  eTrace & 0x100)!
f950: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
f960: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f970: 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b  p->nLTerm; i++){
f980: 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d  .      whereTerm
f990: 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b  Print(p->aLTerm[
f9a0: 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  i], i);.    }.  
f9b0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
f9c0: 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
f9d0: 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
f9e0: 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
f9f0: 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
fa00: 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
fa10: 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
fa20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fa30: 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
fa40: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
fa50: 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
fa60: 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
fa70: 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
fa80: 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
fa90: 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
faa0: 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
fab0: 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
fac0: 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
fad0: 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
fae0: 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
faf0: 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
fb00: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fb10: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
fb20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
fb30: 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
fb40: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
fb50: 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
fb60: 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
fb70: 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
fb80: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
fb90: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
fba0: 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
fbb0: 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
fbd0: 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
fbe0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
fbf0: 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
fc00: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
fc10: 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
fc20: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
fc30: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
fc40: 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
fc50: 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
fc60: 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
fc70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
fc80: 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
fc90: 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
fca0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fcb0: 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62 74  eeNN(db, p->u.bt
fcc0: 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree.pIndex);.   
fcd0: 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49     p->u.btree.pI
fce0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ndex = 0;.    }.
fcf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61    }.}../*.** Dea
fd00: 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c  llocate internal
fd10: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
fd20: 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
fd30: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
fd40: 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  d whereLoopClear
fd50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fd60: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
fd70: 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
fd80: 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
fd90: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
fda0: 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20  b, p->aLTerm);. 
fdb0: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
fdc0: 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77  nion(db, p);.  w
fdd0: 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
fde0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61  .}../*.** Increa
fdf0: 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
fe00: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f  location for pLo
fe10: 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20  op->aLTerm[] to 
fe20: 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a  be at least n..*
fe30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
fe40: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c  reLoopResize(sql
fe50: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
fe60: 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oop *p, int n){.
fe70: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61    WhereTerm **pa
fe80: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  New;.  if( p->nL
fe90: 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e  Slot>=n ) return
fea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
feb0: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61  = (n+7)&~7;.  pa
fec0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
fed0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
fee0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
fef0: 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61  0])*n);.  if( pa
ff00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ff10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ff20: 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65  T;.  memcpy(paNe
ff30: 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69  w, p->aLTerm, si
ff40: 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
ff50: 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20  ])*p->nLSlot);. 
ff60: 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d   if( p->aLTerm!=
ff70: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29  p->aLTermSpace )
ff80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
ff90: 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b  (db, p->aLTerm);
ffa0: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
ffb0: 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f  aNew;.  p->nLSlo
ffc0: 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  t = n;.  return 
ffd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ffe0: 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e  .** Transfer con
fff0: 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65  tent from the se
10000 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20  cond pLoop into 
10010 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74  the first..*/.st
10020 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
10030 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a  opXfer(sqlite3 *
10040 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
10050 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  To, WhereLoop *p
10060 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f  From){.  whereLo
10070 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
10080 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65   pTo);.  if( whe
10090 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
100a0 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54   pTo, pFrom->nLT
100b0 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73  erm) ){.    mems
100c0 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73  et(&pTo->u, 0, s
100d0 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a  izeof(pTo->u));.
100e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
100f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10100 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  }.  memcpy(pTo, 
10110 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f  pFrom, WHERE_LOO
10120 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65  P_XFER_SZ);.  me
10130 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  mcpy(pTo->aLTerm
10140 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c  , pFrom->aLTerm,
10150 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a   pTo->nLTerm*siz
10160 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b  eof(pTo->aLTerm[
10170 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  0]));.  if( pFro
10180 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  m->wsFlags & WHE
10190 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
101a0 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
101b0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
101c0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
101d0 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
101e0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
101f0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72  X)!=0 ){.    pFr
10200 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  om->u.btree.pInd
10210 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ex = 0;.  }.  re
10220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10230 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
10240 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
10250 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
10260 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74  d whereLoopDelet
10270 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10280 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
10290 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64  whereLoopClear(d
102a0 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, p);.  sqlite3
102b0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
102c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
102d0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
102e0 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
102f0 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
10300 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
10310 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
10320 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
10330 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
10340 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10350 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
10360 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
10370 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
10380 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
10390 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
103a0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26 26  Level->pWLoop &&
103b0 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
103c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
103d0 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20 20  E_IN_ABLE) ){.  
103e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
103f0 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
10400 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
10410 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10420 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
10430 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
10440 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c  ->sWC);.    whil
10450 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  e( pWInfo->pLoop
10460 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  s ){.      Where
10470 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f  Loop *p = pWInfo
10480 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20  ->pLoops;.      
10490 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d  pWInfo->pLoops =
104a0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
104b0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
104c0 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
104d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
104e0 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e 66  FreeNN(db, pWInf
104f0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
10500 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
10510 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
10520 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
10530 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
10540 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
10550 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
10560 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61  **   (2)  X is a
10570 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
10580 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20  f Y.**   (3)  X 
10590 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61  skips at least a
105a0 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61  s many columns a
105b0 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72  s Y.**.** By "pr
105c0 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20  oper subset" we 
105d0 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73  mean that X uses
105e0 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
105f0 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61  use terms.** tha
10600 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65  n Y and that eve
10610 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
10620 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69  term used by X i
10630 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62  s also used.** b
10640 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  y Y..**.** If X 
10650 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10660 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69  et of Y then Y i
10670 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63  s a better choic
10680 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74  e and ought.** t
10690 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63  o have a lower c
106a0 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ost.  This routi
106b0 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
106c0 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a  when that cost .
106d0 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  ** relationship 
106e0 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20  is inverted and 
106f0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75  needs to be adju
10700 73 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64  sted.  The third
10710 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64   rule.** was add
10720 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20  ed because if X 
10730 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c  uses skip-scan l
10740 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74  ess than Y it st
10750 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73  ill might.** des
10760 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73  erve a lower cos
10770 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  t even if it is 
10780 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10790 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of Y..*/.static 
107a0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65  int whereLoopChe
107b0 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74  aperProperSubset
107c0 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  (.  const WhereL
107d0 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f  oop *pX,       /
107e0 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f  * First WhereLoo
107f0 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  p to compare */.
10800 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
10810 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20  p *pY        /* 
10820 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  Compare against 
10830 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a  this WhereLoop *
10840 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
10850 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72  .  if( pX->nLTer
10860 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70  m-pX->nSkip >= p
10870 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53  Y->nLTerm-pY->nS
10880 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  kip ){.    retur
10890 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74  n 0; /* X is not
108a0 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a   a subset of Y *
108b0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e  /.  }.  if( pY->
108c0 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69  nSkip > pX->nSki
108d0 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
108e0 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20  if( pX->rRun >= 
108f0 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20  pY->rRun ){.    
10900 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70  if( pX->rRun > p
10910 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e  Y->rRun ) return
10920 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74   0;    /* X cost
10930 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f  s more than Y */
10940 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75  .    if( pX->nOu
10950 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72  t > pY->nOut ) r
10960 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
10970 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10980 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28   Y */.  }.  for(
10990 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  i=pX->nLTerm-1; 
109a0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
109b0 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  if( pX->aLTerm[i
109c0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
109d0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e  .    for(j=pY->n
109e0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
109f0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
10a00 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58  Y->aLTerm[j]==pX
10a10 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72  ->aLTerm[i] ) br
10a20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
10a30 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20  f( j<0 ) return 
10a40 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73  0;  /* X not a s
10a50 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65  ubset of Y since
10a60 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75   term X[i] not u
10a70 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a  sed by Y */.  }.
10a80 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
10a90 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  All conditions m
10aa0 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eet */.}../*.** 
10ab0 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68  Try to adjust th
10ac0 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c  e cost of WhereL
10ad0 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70  oop pTemplate up
10ae0 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72  wards or downwar
10af0 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a  ds so.** that:.*
10b00 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70  *.**   (1) pTemp
10b10 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20  late costs less 
10b20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57  than any other W
10b30 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61  hereLoops that a
10b40 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20  re a proper.**  
10b50 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70       subset of p
10b60 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20  Template.**.**  
10b70 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63   (2) pTemplate c
10b80 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  osts more than a
10b90 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f  ny other WhereLo
10ba0 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54  ops for which pT
10bb0 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20  emplate.**      
10bc0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
10bd0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61  set..**.** To sa
10be0 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69  y "WhereLoop X i
10bf0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10c00 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68  t of Y" means th
10c10 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a  at X uses fewer.
10c20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
10c30 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64  terms than Y and
10c40 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
10c50 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
10c60 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c  ed by X is.** al
10c70 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f  so used by Y..*/
10c80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
10c90 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
10ca0 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70  (const WhereLoop
10cb0 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a   *p, WhereLoop *
10cc0 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66  pTemplate){.  if
10cd0 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  ( (pTemplate->ws
10ce0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
10cf0 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75  DEXED)==0 ) retu
10d00 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70  rn;.  for(; p; p
10d10 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a  =p->pNextLoop){.
10d20 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
10d30 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
10d40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
10d50 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
10d60 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
10d70 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
10d80 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
10d90 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
10da0 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61  ubset(p, pTempla
10db0 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  te) ){.      /* 
10dc0 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
10dd0 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73   cost downward s
10de0 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65  o that it is che
10df0 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20  aper than its . 
10e00 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70       ** subset p
10e10 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
10e20 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
10e30 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
10e40 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
10e50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
10e70 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
10e80 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
10e90 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
10ea0 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  -1));.      pTem
10eb0 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
10ec0 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
10ed0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
10ee0 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20  ->nOut - 1;.    
10ef0 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c  }else if( whereL
10f00 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
10f10 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65  Subset(pTemplate
10f20 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  , p) ){.      /*
10f30 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
10f40 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f  e cost upward so
10f50 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74   that it is cost
10f60 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63  lier than p sinc
10f70 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70  e.      ** pTemp
10f80 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72  late is a proper
10f90 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a   subset of p */.
10fa0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
10fb0 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63  (0x80,("subset c
10fc0 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25  ost adjustment %
10fd0 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22  d,%d to %d,%d\n"
10fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10ff0 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
11000 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c  te->rRun, pTempl
11010 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52  ate->nOut, p->rR
11020 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b  un, p->nOut+1));
11030 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
11040 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e  ->rRun = p->rRun
11050 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11060 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75  e->nOut = p->nOu
11070 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t + 1;.    }.  }
11080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
11090 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
110a0 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72  reLoops in *ppPr
110b0 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  ev looking for o
110c0 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ne that can be.*
110d0 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20  * supplanted by 
110e0 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a  pTemplate..**.**
110f0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
11100 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
11110 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  st contains an e
11120 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75  ntry that can su
11130 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c  pplant.** pTempl
11140 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ate, in other wo
11150 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65  rds if pTemplate
11160 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
11170 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   on the list..**
11180 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57  .** If pX is a W
11190 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54  hereLoop that pT
111a0 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70  emplate can supp
111b0 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72  lant, then retur
111c0 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
111d0 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
111e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
111f0 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c  ate cannot suppl
11200 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ant any existing
11210 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
11220 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a  list but needs.*
11230 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  * to be added to
11240 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20   the list, then 
11250 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
11260 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20   to the tail of 
11270 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
11280 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  tic WhereLoop **
11290 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
112a0 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ser(.  WhereLoop
112b0 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e   **ppPrev,.  con
112c0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  st WhereLoop *pT
112d0 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65  emplate.){.  Whe
112e0 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72  reLoop *p;.  for
112f0 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b  (p=(*ppPrev); p;
11300 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78   ppPrev=&p->pNex
11310 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76  tLoop, p=*ppPrev
11320 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
11330 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
11340 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49  Tab || p->iSortI
11350 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  dx!=pTemplate->i
11360 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20  SortIdx ){.     
11370 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68   /* If either th
11380 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49  e iTab or iSortI
11390 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77  dx values for tw
113a0 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20  o WhereLoop are 
113b0 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20  different.      
113c0 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68  ** then those Wh
113d0 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f  ereLoops need to
113e0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73   be considered s
113f0 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74  eparately.  Neit
11400 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  her is.      ** 
11410 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72  a candidate to r
11420 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72  eplace the other
11430 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  . */.      conti
11440 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  nue;.    }.    /
11450 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
11460 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
11470 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75   the rSetup valu
11480 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  e is either zero
11490 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63  .    ** or the c
114a0 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ost of building 
114b0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
114c0 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74  ex (NlogN) and t
114d0 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20  he NlogN.    ** 
114e0 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20  is the same for 
114f0 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65  compatible Where
11500 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73  Loops. */.    as
11510 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d  sert( p->rSetup=
11520 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d  =0 || pTemplate-
11530 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20  >rSetup==0 .    
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11550 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70  p->rSetup==pTemp
11560 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
11570 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f  .    /* whereLoo
11580 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61  pAddBtree() alwa
11590 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64  ys generates and
115a0 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74   inserts the aut
115b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20  omatic index.   
115c0 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20   ** case first. 
115d0 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c   Hence compatibl
115e0 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72  e candidate Wher
115f0 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76  eLoops never hav
11600 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a  e a larger.    *
11610 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74  * rSetup. Call t
11620 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49  his SETUP-INVARI
11630 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ANT */.    asser
11640 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  t( p->rSetup>=pT
11650 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
11660 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c  );..    /* Any l
11670 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70  oop using an app
11680 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  liation-defined 
11690 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52  index (or PRIMAR
116a0 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20  Y KEY or.    ** 
116b0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
116c0 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  t) with one or m
116d0 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ore == constrain
116e0 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  ts is better.   
116f0 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f   ** than an auto
11700 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c  matic index. Unl
11710 65 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70  ess it is a skip
11720 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  -scan. */.    if
11730 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
11740 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
11750 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
11760 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d  emplate->nSkip)=
11770 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
11780 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
11790 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
117a0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
117b0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
117c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
117d0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  )!=0.     && (p-
117e0 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
117f0 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
11800 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a  emplate->prereq.
11810 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
11820 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
11830 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68  * If existing Wh
11840 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74  ereLoop p is bet
11850 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
11860 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61  te, pTemplate ca
11870 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63  n be.    ** disc
11880 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f  arded.  WhereLoo
11890 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66  p p is better if
118a0 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
118b0 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65  p has no more de
118c0 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
118d0 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20  pTemplate, and. 
118e0 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68     **   (2)  p h
118f0 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
11900 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
11910 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a  Template.    */.
11920 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
11930 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
11940 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
11950 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  eq    /* (1)  */
11960 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
11970 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
11980 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20  Setup           
11990 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a         /* (2a) *
119a0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
119b0 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
119c0 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
119d0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
119e0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f  */.     && p->nO
119f0 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  ut<=pTemplate->n
11a00 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
11a10 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29           /* (2c)
11a20 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
11a30 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44   return 0;  /* D
11a40 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65  iscard pTemplate
11a50 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
11a60 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69  * If pTemplate i
11a70 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20  s always better 
11a80 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75  than p, then cau
11a90 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77  se p to be overw
11aa0 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69  ritten.    ** wi
11ab0 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70  th pTemplate.  p
11ac0 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  Template is bett
11ad0 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20  er than p if:.  
11ae0 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d    **   (1)  pTem
11af0 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72  plate has no mor
11b00 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68  e dependences th
11b10 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  an p, and.    **
11b20 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74     (2)  pTemplat
11b30 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  e has an equal o
11b40 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
11b50 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n p..    */.    
11b60 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
11b70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
11b80 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  eq)==pTemplate->
11b90 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20  prereq   /* (1) 
11ba0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
11bb0 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
11bc0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20   /* (2a) */.    
11bf0 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65   && p->nOut>=pTe
11c00 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
11c30 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
11c40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
11c50 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
11c60 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55  Setup ); /* SETU
11c70 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76  P-INVARIANT abov
11c80 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
11c90 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74  ;   /* Cause p t
11ca0 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  o be overwritten
11cb0 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
11cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11cd0 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f  urn ppPrev;.}../
11ce0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
11cf0 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f  eplace a WhereLo
11d00 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  op entry using t
11d10 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70  he template supp
11d20 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  lied..**.** An e
11d30 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
11d40 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65  p entry might be
11d50 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
11d60 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  the new template
11d70 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e  .** is better an
11d80 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65  d has fewer depe
11d90 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68  ndencies.  Or th
11da0 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20  e template will 
11db0 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e  be ignored.** an
11dc0 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c  d no insert will
11dd0 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69   occur if an exi
11de0 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
11df0 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61  is faster and ha
11e00 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e  s.** fewer depen
11e10 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
11e20 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65   template.  Othe
11e30 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72  rwise a new Wher
11e40 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65  eLoop is.** adde
11e50 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74  d based on the t
11e60 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  emplate..**.** I
11e70 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
11e80 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  et is not NULL t
11e90 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75  hen we care abou
11ea0 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72  t only the.** pr
11eb0 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20  erequisites and 
11ec0 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f  rRun and nOut co
11ed0 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73  sts of the N bes
11ee0 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a  t loops.  That.*
11ef0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  * information is
11f00 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65   gathered in the
11f10 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11f20 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
11f30 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65  special.** proce
11f40 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  ssing mode is us
11f50 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63  ed only for OR c
11f60 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
11f70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63  ..**.** When acc
11f80 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70  umulating multip
11f90 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70  le loops (when p
11fa0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11fb0 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
11fc0 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
11fd0 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
11fe0 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
11ff0 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
12000 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  ** new template 
12010 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70  is better.  Loop
12020 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69  s may be overwri
12030 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c  tten if the foll
12040 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74  owing .** condit
12050 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  ions are met:.**
12060 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79  .**    (1)  They
12070 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
12080 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20  Tab..**    (2)  
12090 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
120a0 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20  me iSortIdx..** 
120b0 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70     (3)  The temp
120c0 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72  late has same or
120d0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
120e0 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ies than the cur
120f0 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
12100 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (4)  The templat
12110 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  e has the same o
12120 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
12130 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
12140 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  op.*/.static int
12150 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
12160 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
12170 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65  r *pBuilder, Whe
12180 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74  reLoop *pTemplat
12190 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  e){.  WhereLoop 
121a0 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20  **ppPrev, *p;.  
121b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
121c0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
121d0 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  Info;.  sqlite3 
121e0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
121f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
12200 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  rc;..  /* If pBu
12210 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
12220 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f   defined, then o
12230 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f  nly keep track o
12240 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a  f the costs.  **
12250 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20   and prereqs..  
12260 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
12270 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a  r->pOrSet!=0 ){.
12280 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74      if( pTemplat
12290 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66  e->nLTerm ){.#if
122a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
122b0 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20  LED.      u16 n 
122c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  = pBuilder->pOrS
122d0 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74  et->n;.      int
122e0 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20   x =.#endif.    
122f0 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
12300 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12310 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  , pTemplate->pre
12320 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  req, pTemplate->
12330 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  rRun,.          
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
12360 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20  ate->nOut);.#if 
12370 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12380 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
12390 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
123a0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
123b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
123c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22  3DebugPrintf(x?"
123d0 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20     or-%d:  ":"  
123e0 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20   or-X:  ", n);. 
123f0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
12400 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
12410 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
12420 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
12430 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
12440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12450 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61  .  /* Look for a
12460 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
12470 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20  Loop to replace 
12480 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20  with pTemplate. 
12490 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41   */.  whereLoopA
124a0 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f  djustCost(pWInfo
124b0 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
124c0 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d  ate);.  ppPrev =
124d0 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65   whereLoopFindLe
124e0 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c  sser(&pWInfo->pL
124f0 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29  oops, pTemplate)
12500 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d  ;..  if( ppPrev=
12510 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
12520 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  re already exist
12530 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e  s a WhereLoop on
12540 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
12550 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20  s better.    ** 
12560 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
12570 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70  so just ignore p
12580 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20  Template */.#if 
12590 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
125a0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
125b0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
125c0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
125d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
125e0 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69  ugPrintf("   ski
125f0 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  p: ");.      whe
12600 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
12610 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d  plate, pBuilder-
12620 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  >pWC);.    }.#en
12630 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
12640 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65  QLITE_OK;  .  }e
12650 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70  lse{.    p = *pp
12660 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Prev;.  }..  /* 
12670 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
12680 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
12690 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
126a0 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
126b0 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
126c0 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
126d0 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
126e0 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
126f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
12700 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
12710 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
12720 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12730 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12740 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
12750 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
12760 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
12770 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12780 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c  ebugPrintf("repl
12790 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  ace: ");.      w
127a0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
127b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
127c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
127d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
127e0 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20     add: ");.    
127f0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12800 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
12810 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  er->pWC);.  }.#e
12820 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20  ndif.  if( p==0 
12830 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ){.    /* Alloca
12840 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  te a new WhereLo
12850 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  op to add to the
12860 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74   end of the list
12870 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20   */.    *ppPrev 
12880 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  = p = sqlite3DbM
12890 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
128a0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
128b0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
128c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
128d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
128e0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
128f0 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f  ;.    p->pNextLo
12900 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  op = 0;.  }else{
12910 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20  .    /* We will 
12920 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57  be overwriting W
12930 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42  hereLoop p[].  B
12940 75 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c  ut before we do,
12950 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f   first.    ** go
12960 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73   through the res
12970 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e  t of the list an
12980 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68  d delete any oth
12990 65 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64  er entries besid
129a0 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68  es.    ** p[] th
129b0 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70  at are also supp
129c0 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  lated by pTempla
129d0 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c  te */.    WhereL
129e0 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26  oop **ppTail = &
129f0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
12a00 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f    WhereLoop *pTo
12a10 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  Del;.    while( 
12a20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20  *ppTail ){.     
12a30 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c   ppTail = whereL
12a40 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70  oopFindLesser(pp
12a50 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29  Tail, pTemplate)
12a60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61  ;.      if( ppTa
12a70 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  il==0 ) break;. 
12a80 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70       pToDel = *p
12a90 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28  pTail;.      if(
12aa0 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65   pToDel==0 ) bre
12ab0 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69  ak;.      *ppTai
12ac0 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78  l = pToDel->pNex
12ad0 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45  tLoop;.#if WHERE
12ae0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
12af0 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
12b00 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
12b10 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
12b20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12b30 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65  gPrintf(" delete
12b40 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68  : ");.        wh
12b50 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f  ereLoopPrint(pTo
12b60 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Del, pBuilder->p
12b70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
12b80 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c  dif.      whereL
12b90 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54  oopDelete(db, pT
12ba0 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oDel);.    }.  }
12bb0 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  .  rc = whereLoo
12bc0 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
12bd0 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28  mplate);.  if( (
12be0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
12bf0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
12c00 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
12c10 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
12c20 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
12c30 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
12c40 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
12c50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
12c60 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
12c70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12c90 41 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65  Adjust the Where
12ca0 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20  Loop.nOut value 
12cb0 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f  downward to acco
12cc0 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  unt for terms of
12cd0 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
12ce0 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65  ause that refere
12cf0 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74  nce the loop but
12d00 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
12d10 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64  sed by an.** ind
12d20 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  ex..*.** For eve
12d30 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ry WHERE clause 
12d40 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74  term that is not
12d50 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64   used by the ind
12d60 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20  ex.** and which 
12d70 68 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62  has a truth prob
12d80 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64  ability assigned
12d90 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   by one of the l
12da0 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20  ikelihood(),.** 
12db0 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c  likely(), or unl
12dc0 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63  ikely() SQL func
12dd0 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68  tions, reduce th
12de0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
12df0 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20  er.** of output 
12e00 72 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62  rows by the prob
12e10 61 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65  ability specifie
12e20 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a  d..**.** TUNING:
12e30 20 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52    For every WHER
12e40 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12e50 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12e60 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12e70 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  nd which does no
12e80 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  t have an assign
12e90 65 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  ed truth probabi
12ea0 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73  lity, heuristics
12eb0 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65  .** described be
12ec0 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20  low are used to 
12ed0 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
12ee0 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
12ef0 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d  ility..** TODO -
12f00 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20  -> Perhaps this 
12f10 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  is something tha
12f20 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f  t could be impro
12f30 76 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a  ved by better.**
12f40 20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63   table statistic
12f50 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74  s..**.** Heurist
12f60 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20  ic 1:  Estimate 
12f70 74 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  the truth probab
12f80 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e  ility as 93.75%.
12f90 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20    The 93.75%.** 
12fa0 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64  value correspond
12fb0 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73  s to -1 in LogEs
12fc0 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74  t notation, so t
12fd0 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d  his means decrem
12fe0 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65  ent.** the Where
12ff0 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20  Loop.nOut field 
13000 66 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57  for every such W
13010 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
13020 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
13030 63 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65  c 2:  If there e
13040 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  xists one or mor
13050 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
13060 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  erms of the.** f
13070 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e  orm "x==EXPR" an
13080 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20  d EXPR is not a 
13090 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c  constant 0 or 1,
130a0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
130b0 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74  the.** final out
130c0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
130d0 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74   is no greater t
130e0 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74  han 1/4 of the t
130f0 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  otal number.** o
13100 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
13110 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
13120 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61  ords, assume tha
13130 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66  t x==EXPR will f
13140 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20  ilter.** out at 
13150 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34  least 3 out of 4
13160 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20   rows.  If EXPR 
13170 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c  is -1 or 0 or 1,
13180 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a   then maybe the.
13190 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73  ** "x" column is
131a0 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65   boolean or else
131b0 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73   -1 or 0 or 1 is
131c0 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c   a common defaul
131d0 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68  t value.** on th
131e0 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64  e "x" column and
131f0 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
13200 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75   only cap the ou
13210 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74  tput row estimat
13220 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74  e.** at 1/2 inst
13230 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73  ead of 1/4..*/.s
13240 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
13250 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
13260 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
13270 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68  *pWC,      /* Th
13280 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
13290 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
132a0 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68  Loop,      /* Th
132b0 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74  e loop to adjust
132c0 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c   downward */.  L
132d0 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20  ogEst nRow      
132e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
132f0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65  of rows in the e
13300 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29  ntire table */.)
13310 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
13320 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74  Term, *pX;.  Bit
13330 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20  mask notAllowed 
13340 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65  = ~(pLoop->prere
13350 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  q|pLoop->maskSel
13360 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  f);.  int i, j, 
13370 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64  k;.  LogEst iRed
13380 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70  uce = 0;    /* p
13390 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c  Loop->nOut shoul
133a0 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f  d not exceed nRo
133b0 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20  w-iReduce */..  
133c0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
133d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
133e0 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29  AUTO_INDEX)==0 )
133f0 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
13400 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d  Term, pTerm=pWC-
13410 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  >a; i>0; i--, pT
13420 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
13430 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
13440 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
13450 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13460 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
13470 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d  eqAll & pLoop->m
13480 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f  askSelf)==0 ) co
13490 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
134a0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
134b0 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21  l & notAllowed)!
134c0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
134d0 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e     for(j=pLoop->
134e0 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
134f0 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d  j--){.      pX =
13500 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
13510 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ];.      if( pX=
13520 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
13530 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65       if( pX==pTe
13540 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
13550 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e    if( pX->iParen
13560 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61  t>=0 && (&pWC->a
13570 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d  [pX->iParent])==
13580 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
13590 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30     }.    if( j<0
135a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
135b0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
135c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
135d0 49 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  If a truth proba
135e0 62 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66  bility is specif
135f0 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69  ied using the li
13600 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73  kelihood() hints
13610 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
13620 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62  n use the probab
13630 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62  ility provided b
13640 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  y the applicatio
13650 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  n. */.        pL
13660 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  oop->nOut += pTe
13670 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
13680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13690 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62      /* In the ab
136a0 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69  sence of explici
136b0 74 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  t truth probabil
136c0 69 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69  ities, use heuri
136d0 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20  stics to.       
136e0 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73   ** guess a reas
136f0 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f  onable truth pro
13700 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20  bability. */.   
13710 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
13720 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
13730 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13740 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29  &(WO_EQ|WO_IS) )
13750 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
13760 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
13770 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
13780 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
13790 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
137a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
137b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
137c0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
137d0 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26  er(pRight, &k) &
137e0 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d  & k>=(-1) && k<=
137f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
13800 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   k = 10;.       
13810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13820 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20        k = 20;.  
13830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13840 20 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c      if( iReduce<
13850 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b  k ) iReduce = k;
13860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13870 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
13880 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e  f( pLoop->nOut >
13890 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20   nRow-iReduce ) 
138a0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e   pLoop->nOut = n
138b0 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d  Row - iReduce;.}
138c0 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54  ../* .** Term pT
138d0 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20  erm is a vector 
138e0 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e  range comparison
138f0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
13900 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e  first comparison
13910 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f  .** in the vecto
13920 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  r can be optimiz
13930 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  ed using column 
13940 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78  nEq of the index
13950 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
13960 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  on returns the t
13970 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76  otal number of v
13980 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74  ector elements t
13990 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
139a0 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ** as part of th
139b0 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73  e range comparis
139c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  on..**.** For ex
139d0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
139e0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
139f0 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
13a00 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20  (b, c, d) > (?, 
13a10 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20  ?, ?).**.** and 
13a20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a  the index:.**.**
13a30 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
13a40 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c  ... ON (a, b, c,
13a50 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65   d, e).**.** the
13a60 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
13a70 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  would be invoked
13a80 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65   with nEq=1. The
13a90 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
13aa0 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20  in.** this case 
13ab0 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  is 3..*/.static 
13ac0 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56 65  int whereRangeVe
13ad0 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65  ctorLen(.  Parse
13ae0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13af0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13b00 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  xt */.  int iCur
13b10 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13b20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70  Cursor open on p
13b30 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
13b40 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a  pIdx,         /*
13b50 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
13b60 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71   used for a ineq
13b70 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
13b80 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20  t */.  int nEq, 
13b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13ba0 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65  umber of prior e
13bb0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
13bc0 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65  nts on same inde
13bd0 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
13be0 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54   *pTerm     /* T
13bf0 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61  he vector inequa
13c00 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
13c10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  */.){.  int nCmp
13c20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
13c30 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e  ctorSize(pTerm->
13c40 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
13c50 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20   int i;..  nCmp 
13c60 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64  = MIN(nCmp, (pId
13c70 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71  x->nColumn - nEq
13c80 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  ));.  for(i=1; i
13c90 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCmp; i++){.   
13ca0 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70   /* Test if comp
13cb0 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72  arison i of pTer
13cc0 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  m is compatible 
13cd0 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e  with column (i+n
13ce0 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  Eq) .    ** of t
13cf0 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74  he index. If not
13d00 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e  , exit the loop.
13d10 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66    */.    char af
13d20 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
13d30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
13d40 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  ison affinity */
13d50 0a 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66  .    char idxaff
13d60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13d70 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f     /* Indexed co
13d80 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a  lumns affinity *
13d90 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
13da0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13db0 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
13dc0 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  n collation sequ
13dd0 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  ence */.    Expr
13de0 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e   *pLhs = pTerm->
13df0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e  pExpr->pLeft->x.
13e00 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
13e10 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68  r;.    Expr *pRh
13e20 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  s = pTerm->pExpr
13e30 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
13e40 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
13e50 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a  EP_xIsSelect ){.
13e60 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68        pRhs = pRh
13e70 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  s->x.pSelect->pE
13e80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13ea0 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e     pRhs = pRhs->
13eb0 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
13ec0 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xpr;.    }..    
13ed0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
13ee0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d  e LHS of the com
13ef0 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c  parison is a col
13f00 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f  umn reference to
13f10 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
13f20 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
13f30 72 69 67 68 74 20 73 6f 75 72 63 65 20 74 61 62  right source tab
13f40 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65  le. And that the
13f50 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64   sort.    ** ord
13f60 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
13f70 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61  column is the sa
13f80 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f  me as the sort o
13f90 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  rder of the.    
13fa0 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65  ** leftmost inde
13fb0 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20  x column.  */.  
13fc0 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d    if( pLhs->op!=
13fd0 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20  TK_COLUMN .     
13fe0 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21  || pLhs->iTable!
13ff0 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70  =iCur .     || p
14000 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49  Lhs->iColumn!=pI
14010 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e  dx->aiColumn[i+n
14020 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64  Eq] .     || pId
14030 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b  x->aSortOrder[i+
14040 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72  nEq]!=pIdx->aSor
14050 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20  tOrder[nEq].    
14060 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
14070 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
14080 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75  ase( pLhs->iColu
14090 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a  mn==XN_ROWID );.
140a0 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
140b0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
140c0 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78  (pRhs, sqlite3Ex
140d0 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29  prAffinity(pLhs)
140e0 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20  );.    idxaff = 
140f0 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
14100 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d  mnAffinity(pIdx-
14110 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69  >pTable, pLhs->i
14120 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28  Column);.    if(
14130 20 61 66 66 21 3d 69 64 78 61 66 66 20 29 20 62   aff!=idxaff ) b
14140 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c  reak;..    pColl
14150 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
14160 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
14170 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68  Parse, pLhs, pRh
14180 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  s);.    if( pCol
14190 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
141a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
141b0 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
141c0 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
141d0 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b  i+nEq]) ) break;
141e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
141f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
14200 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74   the cost C by t
14210 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74  he costMult fact
14220 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79  er T.  This only
14230 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f   occurs if.** co
14240 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
14250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
14260 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53  MULT.*/.#ifdef S
14270 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
14280 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41  TMULT.# define A
14290 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
142a0 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a  er(C,T)  C += T.
142b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
142c0 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
142d0 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a  er(C,T).#endif..
142e0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
142f0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
14300 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
14310 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
14320 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  f the .** index 
14330 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d  pIndex. Try to m
14340 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
14350 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
14360 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14370 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  d, pBuilder->pNe
14380 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73  w->nOut contains
14390 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
143a0 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
143b0 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62   to be visited b
143c0 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e  y filtering usin
143d0 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65  g the nEq .** te
143e0 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20  rms only. If it 
143f0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  is modified, thi
14400 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f  s value is resto
14410 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  red before this 
14420 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
14430 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  urns..**.** If p
14440 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
14450 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
14460 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
14470 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
14480 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
14490 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
144a0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
144b0 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
144c0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
144d0 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
144e0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
144f0 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
14500 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14510 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
14520 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
14530 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
14540 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
14550 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
14560 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
14570 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
14580 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
145a0 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
145b0 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
145c0 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
145d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
145e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
145f0 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
14600 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
14610 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
14620 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
14630 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
14640 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14650 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14660 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
14670 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
14680 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
14690 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
146a0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
146b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
146c0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
146d0 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
146e0 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
146f0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
14700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
14710 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
14720 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
14730 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
14760 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
14770 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
14780 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
14790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
147a0 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
147b0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
147c0 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
147d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
147e0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
147f0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
14800 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
14810 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
14820 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
14830 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
14840 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
14850 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
14860 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
14870 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
14880 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
14890 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
148a0 42 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Btm;            
148b0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
148c0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
148d0 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a  u.btree.nBtm */.
148e0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f 70    u16 saved_nTop
148f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14900 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
14910 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
14920 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75  tree.nTop */.  u
14930 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20  16 saved_nSkip; 
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14950 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
14960 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20   of pNew->nSkip 
14970 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
14980 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
14990 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
149a0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
149b0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67  wsFlags */.  Log
149c0 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  Est saved_nOut; 
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149e0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
149f0 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
14a00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14a10 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
14a20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14a30 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69   */.  LogEst rSi
14a40 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
14a50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14a60 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
14a70 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  able */.  LogEst
14a80 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20   rLogSize;      
14a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
14aa0 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
14ab0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
14ac0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a  erm *pTop = 0, *
14ad0 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70  pBtm = 0; /* Top
14ae0 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
14af0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
14b00 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
14b10 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
14b20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14b30 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
14b40 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
14b50 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30  WHERETRACE(0x800
14b60 2c 20 28 22 42 45 47 49 4e 20 61 64 64 42 74 72  , ("BEGIN addBtr
14b70 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25  eeIdx(%s), nEq=%
14b80 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
14b90 20 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62             pProb
14ba0 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  e->zName, pNew->
14bb0 75 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a  u.btree.nEq));..
14bc0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
14bd0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
14be0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
14bf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
14c00 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
14c10 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
14c20 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
14c30 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
14c40 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
14c50 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
14c60 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
14c70 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
14c80 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
14c90 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61  m==0 );.    opMa
14ca0 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
14cb0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
14cc0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55  LT|WO_LE|WO_ISNU
14cd0 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20  LL|WO_IS;.  }.  
14ce0 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
14cf0 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
14d00 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
14d10 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
14d20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
14d30 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
14d40 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a  be->nColumn );..
14d50 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
14d60 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14d70 0a 20 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20  .  saved_nBtm = 
14d80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
14d90 74 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70  tm;.  saved_nTop
14da0 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
14db0 2e 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e  .nTop;.  saved_n
14dc0 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b  Skip = pNew->nSk
14dd0 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65  ip;.  saved_nLTe
14de0 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  rm = pNew->nLTer
14df0 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61  m;.  saved_wsFla
14e00 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61  gs = pNew->wsFla
14e10 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72  gs;.  saved_prer
14e20 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  eq = pNew->prere
14e30 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20  q;.  saved_nOut 
14e40 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
14e50 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
14e60 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
14e70 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
14e80 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61 76 65 64  ->iCursor, saved
14e90 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20  _nEq,.          
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
14eb0 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
14ec0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
14ed0 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72  0;.  rSize = pPr
14ee0 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
14ef0 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20  [0];.  rLogSize 
14f00 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b  = estLog(rSize);
14f10 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
14f20 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21  ITE_OK && pTerm!
14f30 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72  =0; pTerm = wher
14f40 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
14f50 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d  ){.    u16 eOp =
14f60 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14f70 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  r;   /* Shorthan
14f80 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70  d for pTerm->eOp
14f90 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f  erator */.    Lo
14fa0 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20  gEst rCostIdx;. 
14fb0 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e     LogEst nOutUn
14fc0 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20  adjusted;       
14fd0 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20   /* nOut before 
14fe0 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61  IN() and WHERE a
14ff0 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20  djustments */.  
15000 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
15010 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15020 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
15030 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
15040 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
15050 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
15060 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d  if.    if( (eOp=
15070 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70  =WO_ISNULL || (p
15080 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45  Term->wtFlags&TE
15090 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20  RM_VNULL)!=0).  
150a0 20 20 20 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d     && indexColum
150b0 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c  nNotNull(pProbe,
150c0 20 73 61 76 65 64 5f 6e 45 71 29 0a 20 20 20 20   saved_nEq).    
150d0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
150e0 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20  e; /* ignore IS 
150f0 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74  [NOT] NULL const
15100 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55  raints on NOT NU
15110 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
15120 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72    }.    if( pTer
15130 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
15140 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
15150 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
15160 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
15170 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
15180 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d   of a LIKE optim
15190 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f  ization range co
151a0 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20  nstraint.    ** 
151b0 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f  to mix with a lo
151c0 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20  wer range bound 
151d0 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20  from some other 
151e0 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66  source */.    if
151f0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
15200 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
15210 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  && pTerm->eOpera
15220 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e  tor==WO_LT ) con
15230 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44  tinue;..    /* D
15240 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 49 53 20 63  o not allow IS c
15250 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d 20  onstraints from 
15260 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15270 20 74 6f 20 62 65 20 75 73 65 64 20 62 79 20 74   to be used by t
15280 68 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74 20  he.    ** right 
15290 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
152a0 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73  JOIN.  Only cons
152b0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 4f  traints in the O
152c0 4e 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20 20  N clause are.   
152d0 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20   ** allowed */. 
152e0 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67     if( (pSrc->fg
152f0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
15300 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20  EFT)!=0.     && 
15310 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15320 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
15330 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
15340 20 26 26 20 28 65 4f 70 20 26 20 28 57 4f 5f 49   && (eOp & (WO_I
15350 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  S|WO_ISNULL))!=0
15360 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
15370 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
15380 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
15390 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
153a0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
153b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
153c0 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75  .    if( IsUniqu
153d0 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29 20 26  eIndex(pProbe) &
153e0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
153f0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 29  obe->nKeyCol-1 )
15400 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  {.      pBuilder
15410 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51  ->bldFlags |= SQ
15420 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51 55 45  LITE_BLDF_UNIQUE
15430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15440 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64     pBuilder->bld
15450 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
15460 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a 20 20  BLDF_INDEXED;.  
15470 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73    }.    pNew->ws
15480 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15490 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
154a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
154b0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
154c0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
154d0 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
154e0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
154f0 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54  .nTop = saved_nT
15500 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  op;.    pNew->nL
15510 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
15520 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
15530 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
15540 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
15550 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
15560 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
15570 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
15580 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
15590 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
155a0 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
155b0 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
155c0 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
155d0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
155e0 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
155f0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
15600 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
15610 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
15620 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
15630 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
15640 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
15650 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
15660 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
15670 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
15680 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
15690 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
156a0 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
156b0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
156c0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
156d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
156e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
156f0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
15700 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15710 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15720 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
15730 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
15740 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
15750 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
15760 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
15770 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15780 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
15790 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
157a0 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 0a 20  LogEst(25) );.. 
157b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
157c0 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 61 63 74  pression may act
157d0 75 61 6c 6c 79 20 62 65 20 6f 66 20 74 68 65 20  ually be of the 
157e0 66 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e 20 28  form (x, y) IN (
157f0 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20  SELECT...)..    
15800 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
15810 61 73 65 20 74 68 65 72 65 20 69 73 20 61 20 73  ase there is a s
15820 65 70 61 72 61 74 65 20 74 65 72 6d 20 66 6f 72  eparate term for
15830 20 65 61 63 68 20 6f 66 20 28 78 29 20 61 6e 64   each of (x) and
15840 20 28 79 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a   (y)..        **
15850 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 6e 49   However, the nI
15860 6e 20 6d 75 6c 74 69 70 6c 69 65 72 20 73 68 6f  n multiplier sho
15870 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c  uld only be appl
15880 69 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e  ied once, not on
15890 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  ce.        ** fo
158a0 72 20 65 61 63 68 20 73 75 63 68 20 74 65 72 6d  r each such term
158b0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
158c0 6c 6f 6f 70 20 63 68 65 63 6b 73 20 74 68 61 74  loop checks that
158d0 20 70 54 65 72 6d 20 69 73 20 74 68 65 0a 20 20   pTerm is the.  
158e0 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 73        ** first s
158f0 75 63 68 20 74 65 72 6d 20 69 6e 20 75 73 65 2c  uch term in use,
15900 20 61 6e 64 20 73 65 74 73 20 6e 49 6e 20 62 61   and sets nIn ba
15910 63 6b 20 74 6f 20 30 20 69 66 20 69 74 20 69 73  ck to 0 if it is
15920 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
15930 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77   for(i=0; i<pNew
15940 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29  ->nLTerm-1; i++)
15950 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
15960 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
15970 26 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  && pNew->aLTerm[
15980 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78 70 72  i]->pExpr==pExpr
15990 20 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20   ) nIn = 0;.    
159a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
159b0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
159c0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
159d0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
159e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
159f0 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
15a00 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
15a10 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
15a20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
15a30 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
15a40 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  xpr);.        as
15a50 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20  sert( nIn>0 );  
15a60 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61  /* RHS always ha
15a70 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  s 2 or more term
15a80 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72  s...  The parser
15a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15aa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
15ab0 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
15ac0 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
15ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15ae0 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
15af0 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
15b00 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50     int iCol = pP
15b10 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73  robe->aiColumn[s
15b20 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20  aved_nEq];.     
15b30 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
15b40 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
15b50 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  Q;.      assert(
15b60 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77   saved_nEq==pNew
15b70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
15b80 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d  .      if( iCol=
15b90 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20 20  =XN_ROWID .     
15ba0 20 20 7c 7c 20 28 69 43 6f 6c 3e 30 20 26 26 20    || (iCol>0 && 
15bb0 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76  nInMul==0 && sav
15bc0 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ed_nEq==pProbe->
15bd0 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20  nKeyCol-1).     
15be0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15bf0 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62  iCol>=0 && pProb
15c00 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d  e->uniqNotNull==
15c10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
15c20 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15c30 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
15c40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15c50 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
15c60 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
15c70 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
15c80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15c90 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
15ca0 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
15cb0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15cc0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
15cd0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
15ce0 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
15cf0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
15d00 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15d10 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
15d20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
15d30 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
15d40 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15d50 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
15d60 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
15d70 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  MIT;.      pNew-
15d80 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20  >u.btree.nBtm = 
15d90 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72  whereRangeVector
15da0 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  Len(.          p
15db0 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75  Parse, pSrc->iCu
15dc0 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61  rsor, pProbe, sa
15dd0 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20  ved_nEq, pTerm. 
15de0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 42       );.      pB
15df0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
15e00 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
15e10 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
15e20 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
15e30 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
15e40 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
15e50 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
15e60 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
15e70 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
15e80 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
15e90 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
15ea0 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
15eb0 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
15ec0 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
15ed0 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
15ee0 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
15ef0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
15f00 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
15f10 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
15f20 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
15f30 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
15f40 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
15f50 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
15f60 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15f70 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15f80 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
15f90 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
15fa0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
15fb0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
15fc0 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
15fd0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15fe0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
15ff0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
16000 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a  btree.nTop = 1;.
16010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
16020 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
16030 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
16040 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
16050 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
16060 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
16070 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
16080 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
16090 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
160a0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
160b0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
160c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
160d0 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77 68 65 72  tree.nTop = wher
160e0 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
160f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
16100 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
16110 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  , pProbe, saved_
16120 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20  nEq, pTerm.     
16130 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d   );.      pTop =
16140 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
16150 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
16160 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
16170 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
161a0 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
161b0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
161c0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
161d0 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
161e0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
161f0 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
16200 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
16210 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
16220 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
16230 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
16240 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
16250 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
16260 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
16270 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
16280 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
16290 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
162a0 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
162b0 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
162c0 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
162d0 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
162e0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
162f0 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
16300 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
16310 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
16320 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
16330 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
16340 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
16350 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
16360 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
16370 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
16380 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
16390 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
163a0 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
163b0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
163c0 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
163d0 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
163e0 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
163f0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
16400 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
16410 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
16420 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
16430 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16440 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
16450 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
16460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
16470 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
16480 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
16490 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
164a0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
164b0 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
164c0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
164d0 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
164e0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
164f0 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29  [saved_nEq]>=0 )
16500 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16510 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
16520 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
16530 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
16540 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
16550 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
16560 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
16570 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
16580 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
16590 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
165a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
165b0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
165c0 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
165d0 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
165e0 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
165f0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
16600 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
16610 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
16620 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
16630 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
16640 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
16650 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
16660 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
16670 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
16680 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
16690 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
166a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
166b0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
166c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
166d0 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
166e0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
166f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16700 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
16710 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
16720 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16730 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
16740 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16750 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
16760 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
16770 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
16780 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
16790 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
167a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
167b0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
167c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
167d0 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
167e0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
167f0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
16800 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
16810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16820 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16830 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
16840 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
16860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
16870 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
16880 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
16890 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
168a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
168b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
168c0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
168d0 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
168e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
168f0 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
16900 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
16910 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
16920 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
16930 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
16940 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
16950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16960 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
16970 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
16980 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16990 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
169a0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
169b0 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
169c0 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
169d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
169e0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
169f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
16a00 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
16a10 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
16a20 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
16a30 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
16a40 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
16a50 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
16a60 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
16a70 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
16a80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
16a90 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
16aa0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
16ab0 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
16ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16ae0 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
16af0 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
16b00 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
16b10 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
16b20 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
16b30 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
16b40 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
16b50 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
16b60 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
16b70 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
16b80 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
16b90 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
16ba0 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
16bb0 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
16bc0 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
16bd0 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
16be0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43  able.  */.    rC
16bf0 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  ostIdx = pNew->n
16c00 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  Out + 1 + (15*pP
16c10 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
16c20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61  pSrc->pTab->szTa
16c30 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  bRow;.    pNew->
16c40 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
16c50 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
16c60 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20  , rCostIdx);.   
16c70 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
16c80 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
16c90 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
16ca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  )==0 ){.      pN
16cb0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
16cc0 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
16cd0 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
16ce0 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a  ut + 16);.    }.
16cf0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
16d00 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
16d10 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62  un, pProbe->pTab
16d20 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a  le->costMult);..
16d30 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74      nOutUnadjust
16d40 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ed = pNew->nOut;
16d50 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
16d60 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
16d70 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
16d80 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
16d90 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
16da0 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
16db0 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20  der->pWC, pNew, 
16dc0 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  rSize);.    rc =
16dd0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
16de0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
16df0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
16e00 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16e10 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
16e20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
16e30 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
16e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e50 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f   pNew->nOut = nO
16e60 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20  utUnadjusted;.  
16e70 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e    }..    if( (pN
16e80 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
16e90 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
16ea0 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
16eb0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
16ec0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
16ed0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
16ee0 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
16ef0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
16f00 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
16f10 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
16f20 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
16f30 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
16f40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16f50 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
16f60 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
16f70 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
16f80 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
16f90 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
16fa0 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
16fb0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
16fc0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
16fd0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
16fe0 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
16ff0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17000 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
17010 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20  ;.  pNew->nSkip 
17020 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
17030 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
17040 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
17050 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
17060 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
17070 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
17080 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20  d_nLTerm;..  /* 
17090 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
170a0 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
170b0 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
170c0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
170d0 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
170e0 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
170f0 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
17100 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
17110 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
17120 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
17130 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
17140 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
17150 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a  least 18. .  **.
17160 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e    ** The magic n
17170 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65  umber 18 is sele
17180 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69  cted on the basi
17190 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20  s that scanning 
171a0 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20  17 rows.  ** is 
171b0 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75  almost always qu
171c0 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e  icker than an in
171d0 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74  dex seek (even t
171e0 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64  hough if the ind
171f0 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ex.  ** contains
17200 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37   fewer than 2^17
17210 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20   rows we assume 
17220 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68  otherwise in oth
17230 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a  er parts of.  **
17240 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c   the code). And,
17250 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
17260 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  ot, it should no
17270 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c  t be too much sl
17280 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74  ower. .  ** On t
17290 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
172a0 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63  he extra seeks c
172b0 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e  ould end up bein
172c0 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  g significantly.
172d0 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73    ** more expens
172e0 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ive.  */.  asser
172f0 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 42==sqlite3Lo
17300 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66  gEst(18) );.  if
17310 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  ( saved_nEq==sav
17320 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
17330 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
17340 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
17350 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53   pProbe->noSkipS
17360 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72  can==0.   && pPr
17370 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17380 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
17390 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
173a0 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
173b0 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
173c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
173d0 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
173e0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
173f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
17400 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
17410 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
17420 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
17430 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  w->nSkip++;.    
17440 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
17450 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
17460 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
17470 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
17480 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
17490 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
174a0 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
174b0 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
174c0 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
174d0 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  q+1];.    pNew->
174e0 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20  nOut -= nIter;. 
174f0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42     /* TUNING:  B
17500 65 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e  ecause uncertain
17510 74 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69  ties in the esti
17520 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73  mates for skip-s
17530 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20  can queries,.   
17540 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20   ** add a 1.375 
17550 66 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20  fudge factor to 
17560 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73  make skip-scan s
17570 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b  lightly less lik
17580 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65  ely. */.    nIte
17590 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72  r += 5;.    wher
175a0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
175b0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
175c0 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72  c, pProbe, nIter
175d0 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   + nInMul);.    
175e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
175f0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  ed_nOut;.    pNe
17600 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
17610 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
17620 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
17630 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70  ved_nSkip;.    p
17640 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
17650 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
17660 7d 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  }..  WHERETRACE(
17670 30 78 38 30 30 2c 20 28 22 45 4e 44 20 61 64 64  0x800, ("END add
17680 42 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45  BtreeIdx(%s), nE
17690 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a  q=%d, rc=%d\n",.
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176b0 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e        pProbe->zN
176c0 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20  ame, saved_nEq, 
176d0 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rc));.  return r
176e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
176f0 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
17700 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
17710 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
17720 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
17730 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
17740 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
17750 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
17760 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
17770 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
17780 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
17790 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
177a0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
177b0 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
177c0 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
177d0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
177e0 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
177f0 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
17800 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
17810 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
17820 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
17830 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
17840 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
17850 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
17860 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
17870 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f  .  ExprList *aCo
17880 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c  lExpr;.  int ii,
17890 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
178a0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
178b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
178c0 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
178d0 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
178e0 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
178f0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
17900 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
17910 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
17920 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
17930 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
17940 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
17950 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
17960 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
17970 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
17980 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
17990 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
179a0 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
179b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  ;.      for(jj=0
179c0 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
179d0 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
179e0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
179f0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
17a00 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20  >aiColumn[jj] ) 
17a10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
17a20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
17a30 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64  (aColExpr = pInd
17a40 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30  ex->aColExpr)!=0
17a50 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
17a60 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
17a70 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
17a80 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
17a90 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21  x->aiColumn[jj]!
17aa0 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69  =XN_EXPR ) conti
17ab0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
17ac0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
17ad0 61 72 65 28 70 45 78 70 72 2c 61 43 6f 6c 45 78  are(pExpr,aColEx
17ae0 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c  pr->a[jj].pExpr,
17af0 69 43 75 72 73 6f 72 29 3d 3d 30 20 29 7b 0a 20  iCursor)==0 ){. 
17b00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17b10 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
17b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17b30 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
17b40 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
17b50 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
17b60 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
17b70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
17b80 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
17b90 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
17ba0 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
17bb0 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
17bc0 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
17bd0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
17be0 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
17bf0 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
17c00 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
17c10 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
17c20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
17c30 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
17c40 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
17c50 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
17c60 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
17c70 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17c80 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
17c90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
17ca0 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
17cb0 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
17cc0 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
17cd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17ce0 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
17cf0 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
17d00 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
17d10 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
17d20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
17d30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
17d40 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
17d50 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
17d60 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
17d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17d80 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
17d90 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
17da0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
17db0 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
17dc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
17dd0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
17de0 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
17df0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
17e00 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61 62    if( !whereUsab
17e10 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
17e20 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e  Tab,pWC,pWhere->
17e30 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
17e40 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  0;.    pWhere = 
17e50 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a  pWhere->pRight;.
17e60 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
17e70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
17e80 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
17e90 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
17ea0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
17eb0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
17ec0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  ( sqlite3ExprImp
17ed0 6c 69 65 73 45 78 70 72 28 70 45 78 70 72 2c 20  liesExpr(pExpr, 
17ee0 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20  pWhere, iTab) . 
17ef0 20 20 20 20 26 26 20 28 21 45 78 70 72 48 61 73      && (!ExprHas
17f00 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17f10 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20  EP_FromJoin) || 
17f20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
17f30 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20  nTable==iTab).  
17f40 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
17f50 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
17f60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
17f70 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
17f80 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
17f90 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
17fa0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
17fb0 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
17fc0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
17fd0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
17fe0 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
17ff0 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
18000 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
18010 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
18020 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
18030 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28  *.** The costs (
18040 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20  WhereLoop.rRun) 
18050 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f  of the b-tree lo
18060 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69  ops added by thi
18070 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  s function.** ar
18080 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  e calculated as 
18090 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46  follows:.**.** F
180a0 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20  or a full scan, 
180b0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62  assuming the tab
180c0 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f  le (or index) co
180d0 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73  ntains nRow rows
180e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
180f0 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20   = nRow * 3.0   
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73   // full-table s
18120 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  can.**     cost 
18130 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20  = nRow * K      
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72  // scan of cover
18160 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18170 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28   cost = nRow * (
18180 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20  K+3.0)          
18190 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
181a0 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
181b0 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  dex.**.** where 
181c0 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74  K is a value bet
181d0 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
181e0 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
181f0 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65  e relative .** e
18200 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65  stimated average
18210 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
18220 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63  ex and table rec
18230 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ords..**.** For 
18240 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77  an index scan, w
18250 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74  here nVisit is t
18260 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  he number of ind
18270 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a  ex rows visited.
18280 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20  ** by the scan, 
18290 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65  and nSeek is the
182a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20   number of seek 
182b0 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69  operations requi
182c0 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69  red on .** the i
182d0 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a  ndex b-tree:.**.
182e0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
182f0 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
18300 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20   + K * nVisit)  
18310 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72          // cover
18320 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18330 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
18340 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b  (log(nRow) + (K+
18350 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20  3.0) * nVisit)  
18360 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e    // non-coverin
18370 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f  g index.**.** No
18380 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73  rmally, nSeek is
18390 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73   1. nSeek values
183a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20   greater than 1 
183b0 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68  come about if th
183c0 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  e .** WHERE clau
183d0 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49  se includes "x I
183e0 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20  N (....)" terms 
183f0 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
18400 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20   "x=?". Or when 
18410 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20  .** implicit "x 
18420 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
18430 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72  M tbl)" terms ar
18440 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70  e added for skip
18450 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  -scans..**.** Th
18460 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75  e estimated valu
18470 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74  es (nRow, nVisit
18480 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63  , nSeek) often c
18490 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61  ontain a large a
184a0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65  mount.** of unce
184b0 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68  rtainty.  For th
184c0 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69  is reason, scori
184d0 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ng is designed t
184e0 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61  o pick plans tha
184f0 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61  t.** "do the lea
18500 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20  st harm" if the 
18510 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e  estimates are in
18520 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65  accurate.  For e
18530 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67  xample, a.** log
18540 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73  (nRow) factor is
18550 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20   omitted from a 
18560 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18570 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72  ex scan in order
18580 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20   to.** bias the 
18590 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72  scoring in favor
185a0 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
185b0 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f  ex, since the wo
185c0 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66  rst-case.** perf
185d0 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67  ormance of using
185e0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72   an index is far
185f0 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
18600 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66   worst-case perf
18610 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20  ormance.** of a 
18620 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e  full table scan.
18630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18640 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
18650 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
18660 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
18670 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18680 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
18690 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
186b0 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
186c0 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
186d0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
186e0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
186f0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
18700 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
18710 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
18720 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
18730 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
18740 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
18750 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
18760 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
18770 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
18780 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
18790 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
187a0 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69  y */.  LogEst ai
187b0 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20  RowEstPk[2];    
187c0 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c     /* The aiRowL
187d0 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  ogEst[] value fo
187e0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
187f0 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d  */.  i16 aiColum
18800 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
18810 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
18820 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
18830 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
18840 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
18850 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
18860 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
18870 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18880 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
18890 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
188a0 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
188b0 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
188c0 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
188d0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
188e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
188f0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
18900 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
18910 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18920 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
18930 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
18940 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
18950 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
18980 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45   value */.  LogE
18990 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
189a0 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
189b0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
189c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
189d0 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
189e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
189f0 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62  ithm of the numb
18a00 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
18a10 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
18a20 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
18a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18a40 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61  parsed WHERE cla
18a50 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  use */.  Table *
18a60 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
18a70 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
18a80 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
18a90 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c   .  pNew = pBuil
18aa0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49  der->pNew;.  pWI
18ab0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
18ac0 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69  pWInfo;.  pTabLi
18ad0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
18ae0 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20  bList;.  pSrc = 
18af0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
18b00 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62  ew->iTab;.  pTab
18b10 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
18b20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
18b30 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20  >pWC;.  assert( 
18b40 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
18b50 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
18b60 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
18b70 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
18b80 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
18b90 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
18ba0 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
18bb0 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65  se */.    pProbe
18bc0 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65   = pSrc->pIBInde
18bd0 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  x;.  }else if( !
18be0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
18bf0 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  {.    pProbe = p
18c00 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Tab->pIndex;.  }
18c10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
18c20 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
18c30 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
18c40 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
18c50 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
18c60 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
18c70 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
18c80 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
18c90 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
18ca0 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
18cb0 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
18cc0 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
18cd0 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
18ce0 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
18cf0 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
18d00 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
18d10 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
18d20 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
18d30 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
18d40 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
18d50 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
18d60 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
18d70 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
18d80 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79  ));.    sPk.nKey
18d90 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  Col = 1;.    sPk
18da0 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
18db0 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
18dc0 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
18dd0 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73    sPk.aiRowLogEs
18de0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
18df0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
18e00 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
18e10 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
18e20 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49  Tab;.    sPk.szI
18e30 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a  dxRow = pTab->sz
18e40 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f  TabRow;.    aiRo
18e50 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
18e60 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
18e70 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
18e80 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
18e90 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
18ea0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
18eb0 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
18ec0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
18ed0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
18ee0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
18ef0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
18f00 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
18f10 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
18f20 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
18f30 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
18f40 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
18f50 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
18f60 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
18f70 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
18f80 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
18f90 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
18fa0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
18fb0 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
18fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18fd0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
18fe0 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
18ff0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
19000 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
19010 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61  t      /* Not pa
19020 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69  rt of an OR opti
19030 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26  mization */.   &
19040 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
19050 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
19060 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
19070 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
19080 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
19090 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
190a0 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
190b0 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20  c->pIBIndex==0  
190c0 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e      /* Has no IN
190d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
190e0 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
190f0 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20  fg.notIndexed   
19100 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e  /* Has no NOT IN
19110 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a  DEXED clause */.
19120 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
19130 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab)         /* 
19140 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49  Not WITHOUT ROWI
19150 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a  D table. (FIXME:
19160 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20   Why not?) */.  
19170 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
19180 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f  Correlated /* No
19190 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
191a0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26  ubquery */.   &&
191b0 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63   !pSrc->fg.isRec
191c0 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61  ursive  /* Not a
191d0 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f   recursive commo
191e0 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
191f0 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  on. */.  ){.    
19200 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
19210 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
19220 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
19230 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
19240 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
19250 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
19260 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
19270 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
19280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
19290 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
192a0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
192b0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
192c0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
192d0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
192e0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
192f0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
19300 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
19310 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19320 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
19330 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b         pNew->nSk
19340 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
19350 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
19360 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
19370 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
19380 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19390 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
193a0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
193b0 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
193c0 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
193d0 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
193e0 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
193f0 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20     ** estimated 
19400 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e  to be X*N*log2(N
19410 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
19420 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19430 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
19440 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
19450 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20  dexed and where 
19460 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32  X is 7 (LogEst=2
19470 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  8) for normal.  
19480 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
19490 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74  or 1.375 (LogEst
194a0 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e  =4) for views an
194b0 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  d subqueries.  T
194c0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
194d0 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c   ** of X is smal
194e0 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e  ler for views an
194f0 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20  d subqueries so 
19500 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
19510 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a  lanner.        *
19520 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61  * will be more a
19530 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20  ggressive about 
19540 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d  generating autom
19550 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72  atic indexes for
19560 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73  .        ** thos
19570 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65  e objects, since
19580 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70   there is no opp
19590 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20  ortunity to add 
195a0 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a  schema.        *
195b0 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62  * indexes on sub
195c0 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77  queries and view
195d0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
195e0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
195f0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
19600 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  4;.        if( p
19610 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
19620 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
19630 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
19640 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
19650 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
19660 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d  += 24;.        }
19670 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
19680 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19690 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d  w->rSetup, pTab-
196a0 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
196b0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53      if( pNew->rS
196c0 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72  etup<0 ) pNew->r
196d0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
196e0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
196f0 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
19700 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
19710 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
19720 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
19730 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
19740 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
19750 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
19760 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
19770 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
19780 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
19790 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
197a0 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
197b0 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
197c0 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
197d0 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
197e0 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
197f0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
19800 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
19810 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
19820 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
19830 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
19840 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
19850 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
19860 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
19870 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
19880 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
19890 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
198a0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
198b0 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72  = mPrereq | pTer
198c0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
198d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
198e0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
198f0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
19900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19910 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19920 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
19930 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
19940 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
19950 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
19960 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
19970 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
19980 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
19990 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
199a0 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
199b0 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
199c0 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
199d0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
199e0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
199f0 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  WC, pProbe->pPar
19a00 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20  tIdxWhere) ){.  
19a10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
19a20 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e  ew->iTab!=pSrc->
19a30 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53  iCursor );  /* S
19a40 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37  ee ticket [98d97
19a50 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20  3b8f5] */.      
19a60 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
19a70 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
19a80 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
19a90 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
19aa0 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50  }.    rSize = pP
19ab0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
19ac0 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  t[0];.    pNew->
19ad0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
19ae0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
19af0 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20  ee.nBtm = 0;.   
19b00 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
19b10 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Top = 0;.    pNe
19b20 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
19b30 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
19b40 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
19b50 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
19b60 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
19b70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
19b80 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20  eq = mPrereq;.  
19b90 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
19ba0 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
19bb0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
19bc0 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
19bd0 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
19be0 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
19bf0 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
19c00 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
19c10 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
19c20 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
19c30 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
19c40 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
19c50 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
19c60 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
19c70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
19c80 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
19c90 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
19ca0 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
19cb0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
19cc0 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
19cd0 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
19ce0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
19cf0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
19d00 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
19d10 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
19d20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
19d30 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
19d40 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
19d50 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
19d60 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
19d70 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20  (N*3.0). */.    
19d80 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
19d90 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20  Size + 16;.     
19da0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
19db0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
19dc0 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
19dd0 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
19de0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
19df0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
19e00 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
19e10 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
19e20 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
19e30 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
19e40 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
19e50 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
19e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
19e70 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
19e80 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
19e90 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
19ea0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
19eb0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
19ec0 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
19ed0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
19ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19ef0 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
19f00 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
19f10 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
19f20 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19f30 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
19f40 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
19f50 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
19f60 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
19f70 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  D;.      }..    
19f80 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
19f90 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
19fa0 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
19fb0 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  | !HasRowid(pTab
19fc0 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 72 6f  ).       || pPro
19fd0 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
19fe0 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  e!=0.       || (
19ff0 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26   m==0.         &
1a000 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  & pProbe->bUnord
1a010 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
1a020 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49   && (pProbe->szI
1a030 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
1a040 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26  bRow).         &
1a050 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
1a060 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
1a070 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
1a080 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
1a090 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a0a0 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
1a0b0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
1a0c0 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
1a0d0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
1a0e0 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
1a0f0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
1a100 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1a110 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1a120 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
1a130 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
1a140 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
1a150 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ing the index ro
1a160 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65  ws is N*K, where
1a170 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   K is.        **
1a180 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
1a190 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20   3.0, depending 
1a1a0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
1a1b0 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20  sizes of the.   
1a1c0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e       ** index an
1a1d0 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 2a 2f  d table rows. */
1a1e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1a1f0 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20  Run = rSize + 1 
1a200 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
1a210 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
1a220 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
1a230 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
1a240 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1a250 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
1a260 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 61  ng index scan, a
1a270 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74 20 6f  dd in the cost o
1a280 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  f.          ** d
1a290 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  oing table looku
1a2a0 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20 77 69  ps.  The cost wi
1a2b0 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e 75 6d  ll be 3x the num
1a2c0 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
1a2d0 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 61   ** lookups.  Ta
1a2e0 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20  ke into account 
1a2f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1a300 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 0a 20  ms that can be. 
1a310 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 74 69           ** sati
1a320 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75 73 74  sfied using just
1a330 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
1a340 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1a350 69 72 65 20 61 0a 20 20 20 20 20 20 20 20 20 20  ire a.          
1a360 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e  ** table lookup.
1a370 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c 6f   */.          Lo
1a380 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72  gEst nLookup = r
1a390 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a 20 42  Size + 16;  /* B
1a3a0 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33 20 2a  ase cost:  N*3 *
1a3b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
1a3c0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ii;.          in
1a3d0 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
1a3e0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
1a3f0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1a400 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  WC2 = &pWInfo->s
1a410 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  WC;.          fo
1a420 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 32 2d  r(ii=0; ii<pWC2-
1a430 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
1a440 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
1a450 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
1a460 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  WC2->a[ii];.    
1a470 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
1a480 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
1a490 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 45  yIndex(pTerm->pE
1a4a0 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72 6f 62  xpr, iCur, pProb
1a4b0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
1a4c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a4d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a4e0 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20 63 61       /* pTerm ca
1a4f0 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 75  n be evaluated u
1a500 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
1a510 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63 65 0a  dex.  So reduce.
1a520 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1a530 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
1a540 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f 6f 6b  er of table look
1a550 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  ups accordingly 
1a560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1a570 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
1a580 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
1a590 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 20          nLookup 
1a5a0 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
1a5b0 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rob;.           
1a5c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a5d0 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b        nLookup--;
1a5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1a5f0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1a600 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1a610 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d  IS) ) nLookup -=
1a620 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20 20 20   19;.           
1a630 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1a640 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1a650 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1a660 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1a670 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c  d(pNew->rRun, nL
1a680 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  ookup);.        
1a690 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
1a6a0 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
1a6b0 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
1a6c0 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
1a6d0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
1a6e0 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
1a6f0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
1a700 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1a710 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a720 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a730 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
1a740 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1a750 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
1a760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a770 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
1a780 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ags = 0;.    rc 
1a790 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1a7a0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
1a7b0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
1a7c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 42 75   0);.    if( pBu
1a7d0 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 3d  ilder->bldFlags=
1a7e0 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44  =SQLITE_BLDF_IND
1a7f0 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EXED ){.      /*
1a800 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71 75 65   If a non-unique
1a810 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 2c 20   index is used, 
1a820 6f 72 20 69 66 20 61 20 70 72 65 66 69 78 20 6f  or if a prefix o
1a830 66 20 74 68 65 20 6b 65 79 20 66 6f 72 0a 20 20  f the key for.  
1a840 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 20 69 6e      ** unique in
1a850 64 65 78 20 69 73 20 75 73 65 64 20 28 6d 61 6b  dex is used (mak
1a860 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 66 75  ing the index fu
1a870 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e 2d 75  nctionally non-u
1a880 6e 69 71 75 65 29 0a 20 20 20 20 20 20 2a 2a 20  nique).      ** 
1a890 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  then the sqlite_
1a8a0 73 74 61 74 31 20 64 61 74 61 20 62 65 63 6f 6d  stat1 data becom
1a8b0 65 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72  es important for
1a8c0 20 73 63 6f 72 69 6e 67 20 74 68 65 0a 20 20 20   scoring the.   
1a8d0 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a 20 20     ** plan */.  
1a8e0 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
1a8f0 67 73 20 7c 3d 20 54 46 5f 53 74 61 74 73 55 73  gs |= TF_StatsUs
1a900 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ed;.    }.#ifdef
1a910 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1a920 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
1a930 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
1a940 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
1a950 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
1a960 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
1a970 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
1a980 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
1a990 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
1a9a0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
1a9b0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1a9c0 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
1a9d0 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
1a9e0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
1a9f0 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1aa00 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b  pIBIndex ) break
1aa10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1aa20 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1aa30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1aa40 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72  LTABLE../*.** Ar
1aa50 67 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20  gument pIdxInfo 
1aa60 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
1aa70 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f  ated with all co
1aa80 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d  nstraints that m
1aa90 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79  ay.** be used by
1aaa0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1aab0 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
1aac0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
1aad0 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66  >iTab. This.** f
1aae0 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20  unction marks a 
1aaf0 73 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20  subset of those 
1ab00 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62  constraints usab
1ab10 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  le, invokes the.
1ab20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  ** xBestIndex me
1ab30 74 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68  thod and adds th
1ab40 65 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20  e returned plan 
1ab50 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
1ab60 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20  ** A constraint 
1ab70 69 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65  is marked usable
1ab80 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41   if:.**.**   * A
1ab90 72 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20  rgument mUsable 
1aba0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69  indicates that i
1abb0 74 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ts prerequisites
1abc0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
1abd0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74  and.**.**   * It
1abe0 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74   is not one of t
1abf0 68 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65  he operators spe
1ac00 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45  cified in the mE
1ac10 78 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73  xclude mask pass
1ac20 65 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65  ed.**     as the
1ac30 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
1ac40 20 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74   (which in pract
1ac50 69 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f  ice is either WO
1ac60 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a  _IN or 0)..**.**
1ac70 20 41 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65   Argument mPrere
1ac80 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74  q is a mask of t
1ac90 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1aca0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1acb0 65 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  e the.** virtual
1acc0 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
1acd0 6f 6e 2e 20 54 68 65 73 65 20 61 72 65 20 61 64  on. These are ad
1ace0 64 65 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73  ded to the plans
1acf0 20 70 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a   prerequisites.*
1ad00 2a 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 61  * before it is a
1ad10 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1ad20 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70  ..**.** Output p
1ad30 61 72 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69  arameter *pbIn i
1ad40 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
1ad50 20 74 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20   the plan added 
1ad60 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75  to pBuilder.** u
1ad70 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1ad80 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20  WO_IN terms, or 
1ad90 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
1ada0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1adb0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1adc0 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f  alOne(.  WhereLo
1add0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1ade0 64 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d  der,.  Bitmask m
1adf0 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20  Prereq,         
1ae00 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1ae10 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75  f tables that mu
1ae20 73 74 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20  st be used. */. 
1ae30 20 42 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65   Bitmask mUsable
1ae40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ae50 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62   /* Mask of usab
1ae60 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75  le tables */.  u
1ae70 31 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20  16 mExclude,    
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae90 2a 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20  * Exclude terms 
1aea0 75 73 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72  using these oper
1aeb0 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ators */.  sqlit
1aec0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1aed0 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f  IdxInfo,   /* Po
1aee0 70 75 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66  pulated object f
1aef0 6f 72 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  or xBestIndex */
1af00 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20  .  u16 mNoOmit, 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69     /* Do not omi
1af30 74 20 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69  t these constrai
1af40 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
1af50 49 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  In              
1af60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1af70 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1af80 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70  es an IN(...) op
1af90 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c   */.){.  WhereCl
1afa0 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69  ause *pWC = pBui
1afb0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72  lder->pWC;.  str
1afc0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
1afd0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
1afe0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
1aff0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1b000 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
1b010 2a 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e  *pUsage = pIdxIn
1b020 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
1b030 73 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sage;.  int i;. 
1b040 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69   int mxTerm;.  i
1b050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b060 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1b070 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1b080 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a  >pNew;.  Parse *
1b090 70 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65  pParse = pBuilde
1b0a0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  r->pWInfo->pPars
1b0b0 65 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  e;.  struct SrcL
1b0c0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d  ist_item *pSrc =
1b0d0 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e   &pBuilder->pWIn
1b0e0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1b0f0 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69  pNew->iTab];.  i
1b100 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
1b110 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
1b120 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72  traint;..  asser
1b130 74 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50  t( (mUsable & mP
1b140 72 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20  rereq)==mPrereq 
1b150 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a  );.  *pbIn = 0;.
1b160 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
1b170 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20   mPrereq;..  /* 
1b180 53 65 74 20 74 68 65 20 75 73 61 62 6c 65 20 66  Set the usable f
1b190 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65  lag on the subse
1b1a0 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  t of constraints
1b1b0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
1b1c0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d    ** arguments m
1b1d0 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c  Usable and mExcl
1b1e0 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f  ude. */.  pIdxCo
1b1f0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
1b200 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1b210 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
1b220 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
1b230 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1b240 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
1b250 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
1b260 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1b270 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78  m = &pWC->a[pIdx
1b280 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
1b290 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  t];.    pIdxCons
1b2a0 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ->usable = 0;.  
1b2b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1b2c0 65 72 65 71 52 69 67 68 74 20 26 20 6d 55 73 61  ereqRight & mUsa
1b2d0 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65  ble)==pTerm->pre
1b2e0 72 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 26  reqRight .     &
1b2f0 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  & (pTerm->eOpera
1b300 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d  tor & mExclude)=
1b310 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1b320 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
1b330 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1b340 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1b350 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c   the output fiel
1b360 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ds of the sqlite
1b370 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
1b380 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73  ucture */.  mems
1b390 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
1b3a0 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
1b3b0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
1b3c0 61 73 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f  assert( pIdxInfo
1b3d0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1b3e0 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49  tr==0 );.  pIdxI
1b3f0 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
1b400 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
1b410 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Num = 0;.  pIdxI
1b420 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1b430 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78  umed = 0;.  pIdx
1b440 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
1b450 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
1b460 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32  _DBL / (double)2
1b470 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
1b480 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35  timatedRows = 25
1b490 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
1b4a0 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49  xFlags = 0;.  pI
1b4b0 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20  dxInfo->colUsed 
1b4c0 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
1b4d0 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a  )pSrc->colUsed;.
1b4e0 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
1b4f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
1b500 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68  BestIndex() meth
1b510 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61  od */.  rc = vta
1b520 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
1b530 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70  e, pSrc->pTab, p
1b540 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  IdxInfo);.  if( 
1b550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1b560 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a  .  mxTerm = -1;.
1b570 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1b580 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61  nLSlot>=nConstra
1b590 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  int );.  for(i=0
1b5a0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
1b5b0 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65   i++) pNew->aLTe
1b5c0 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65  rm[i] = 0;.  pNe
1b5d0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1b5e0 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f  sk = 0;.  pIdxCo
1b5f0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
1b600 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
1b610 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
1b620 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
1b630 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1b640 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
1b650 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
1b660 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20   int iTerm;.    
1b670 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73  if( (iTerm = pUs
1b680 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
1b690 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20   - 1)>=0 ){.    
1b6a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1b6b0 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20  rm;.      int j 
1b6c0 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
1b6d0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  mOffset;.      i
1b6e0 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
1b6f0 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20  raint.       || 
1b700 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e  j<0.       || j>
1b710 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20  =pWC->nTerm.    
1b720 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
1b730 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
1b740 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d      || pIdxCons-
1b750 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20  >usable==0.     
1b760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b770 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1b780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1b790 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
1b7a0 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c  s.xBestIndex mal
1b7b0 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e  function",pSrc->
1b7c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1b7d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1b7f0 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
1b800 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
1b810 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b820 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   j==0 );.      t
1b830 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d  estcase( j==pWC-
1b840 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20  >nTerm-1 );.    
1b850 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
1b860 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  a[j];.      pNew
1b870 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72  ->prereq |= pTer
1b880 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1b890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54        assert( iT
1b8a0 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  erm<pNew->nLSlot
1b8b0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
1b8c0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
1b8d0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  pTerm;.      if(
1b8e0 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
1b8f0 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
1b900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b910 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
1b920 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1b930 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
1b940 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
1b950 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
1b960 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1b970 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
1b980 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  rm;.      if( (p
1b990 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1b9a0 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20  & WO_IN)!=0 ){. 
1b9b0 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
1b9c0 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
1b9d0 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
1b9e0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
1b9f0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  y not.        **
1ba00 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
1ba10 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
1ba20 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
1ba30 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
1ba40 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
1ba50 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
1ba60 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
1ba70 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
1ba80 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  s and.        **
1ba90 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
1baa0 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
1bab0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
1bac0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
1bad0 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
1bae0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
1baf0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1bb00 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
1bb10 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
1bb20 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  xFlags &= ~SQLIT
1bb30 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
1bb40 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  QUE;.        *pb
1bb50 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20  In = 1; assert( 
1bb60 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49  (mExclude & WO_I
1bb70 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  N)==0 );.      }
1bb80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
1bb90 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
1bba0 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a  sk &= ~mNoOmit;.
1bbb0 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1bbc0 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 61 73  = mxTerm+1;.  as
1bbd0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
1bbe0 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
1bbf0 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   );.  pNew->u.vt
1bc00 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78  ab.idxNum = pIdx
1bc10 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20  Info->idxNum;.  
1bc20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1bc30 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
1bc40 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1bc50 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  tr;.  pIdxInfo->
1bc60 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1bc70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
1bc80 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
1bc90 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
1bca0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1bcb0 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28  sOrdered = (i8)(
1bcc0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1bcd0 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20  yConsumed ?.    
1bce0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
1bcf0 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65  erBy : 0);.  pNe
1bd00 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1bd10 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
1bd20 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44  lite3LogEstFromD
1bd30 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
1bd40 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
1bd50 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
1bd60 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64  qlite3LogEst(pId
1bd70 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1bd80 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Rows);..  /* Set
1bd90 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
1bda0 57 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42  W flag if the xB
1bdb0 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1bdc0 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a  d indicated.  **
1bdd0 20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77   that the scan w
1bde0 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73  ill visit at mos
1bdf0 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72  t one row. Clear
1be00 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a   it otherwise. *
1be10 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  /.  if( pIdxInfo
1be20 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c  ->idxFlags & SQL
1be30 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1be40 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65  NIQUE ){.    pNe
1be50 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
1be60 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65  ERE_ONEROW;.  }e
1be70 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  lse{.    pNew->w
1be80 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
1be90 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  _ONEROW;.  }.  r
1bea0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1beb0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1bec0 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ew);.  if( pNew-
1bed0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1bee0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1bef0 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
1bf00 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70  b.idxStr);.    p
1bf10 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1bf20 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
1bf30 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
1bf40 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72  f, ("  bIn=%d pr
1bf50 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72  ereqIn=%04llx pr
1bf60 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e  ereqOut=%04llx\n
1bf70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1bf80 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20           *pbIn, 
1bf90 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1bfa0 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  mPrereq,.       
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bfc0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28  sqlite3_uint64)(
1bfd0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1bfe0 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72  mPrereq)));..  r
1bff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1c000 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
1c010 63 74 20 75 73 65 64 20 74 6f 20 70 61 73 73 20  ct used to pass 
1c020 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1c030 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1c040 74 75 61 6c 28 29 0a 2a 2a 20 74 6f 20 73 71 6c  tual().** to sql
1c050 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c 61 74  ite3_vtab_collat
1c060 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74  ion()..*/.struct
1c070 20 42 65 73 74 49 6e 64 65 78 43 74 78 20 7b 0a   BestIndexCtx {.
1c080 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1c090 57 43 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  WC;.  sqlite3_in
1c0a0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
1c0b0 66 6f 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo;.  Parse *pPa
1c0c0 72 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  rse;.};../*.** I
1c0d0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
1c0e0 69 73 20 69 6e 76 6f 6b 65 64 20 66 72 6f 6d 20  is invoked from 
1c0f0 77 69 74 68 69 6e 20 61 6e 20 78 42 65 73 74 49  within an xBestI
1c100 6e 64 65 78 28 29 20 63 61 6c 6c 62 61 63 6b 2c  ndex() callback,
1c110 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61   it.** returns a
1c120 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
1c130 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1c140 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1c150 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71  collation.** seq
1c160 75 65 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64  uence associated
1c170 20 77 69 74 68 20 65 6c 65 6d 65 6e 74 20 69 43   with element iC
1c180 6f 6e 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ons of the sqlit
1c190 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 61 43  e3_index_info.aC
1c1a0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 61 72 72  onstraint.** arr
1c1b0 61 79 2e 20 4f 72 2c 20 69 66 20 69 43 6f 6e 73  ay. Or, if iCons
1c1c0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1c1d0 20 6f 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20   or there is no 
1c1e0 61 63 74 69 76 65 20 78 42 65 73 74 49 6e 64 65  active xBestInde
1c1f0 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65 74 75 72  x.** call, retur
1c200 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 74  n NULL..*/.const
1c210 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76   char *sqlite3_v
1c220 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28 73 71  tab_collation(sq
1c230 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
1c240 43 6f 6e 73 29 7b 0a 20 20 73 74 72 75 63 74 20  Cons){.  struct 
1c250 42 65 73 74 49 6e 64 65 78 43 74 78 20 2a 70 20  BestIndexCtx *p 
1c260 3d 20 28 73 74 72 75 63 74 20 42 65 73 74 49 6e  = (struct BestIn
1c270 64 65 78 43 74 78 2a 29 64 62 2d 3e 70 42 65 73  dexCtx*)db->pBes
1c280 74 49 6e 64 65 78 43 74 78 3b 0a 20 20 63 6f 6e  tIndexCtx;.  con
1c290 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
1c2a0 30 3b 0a 20 20 69 66 28 20 70 20 26 26 20 69 43  0;.  if( p && iC
1c2b0 6f 6e 73 3e 3d 30 20 26 26 20 69 43 6f 6e 73 3c  ons>=0 && iCons<
1c2c0 70 2d 3e 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  p->pIdxInfo->nCo
1c2d0 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
1c2e0 69 6e 74 20 69 54 65 72 6d 20 3d 20 70 2d 3e 70  int iTerm = p->p
1c2f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1c300 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69 54 65 72  aint[iCons].iTer
1c310 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 45 78 70  mOffset;.    Exp
1c320 72 20 2a 70 58 20 3d 20 70 2d 3e 70 57 43 2d 3e  r *pX = p->pWC->
1c330 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a  a[iTerm].pExpr;.
1c340 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 20      CollSeq *pC 
1c350 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
1c360 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 2d  ompareCollSeq(p-
1c370 3e 70 50 61 72 73 65 2c 70 58 2d 3e 70 4c 65 66  >pParse,pX->pLef
1c380 74 2c 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  t,pX->pRight);. 
1c390 20 20 20 7a 52 65 74 20 3d 20 28 70 43 20 3f 20     zRet = (pC ? 
1c3a0 70 43 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  pC->zName : "BIN
1c3b0 41 52 59 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ARY");.  }.  ret
1c3c0 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
1c3d0 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
1c3e0 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
1c3f0 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
1c400 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20  join identified 
1c410 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e  by.** pBuilder->
1c420 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
1c430 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
1c440 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69  nteed to be a vi
1c450 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
1c460 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1c470 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53  no LEFT or CROSS
1c480 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74   JOIN joins in t
1c490 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d  he query, both m
1c4a0 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55  Prereq and.** mU
1c4b0 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74 20  nusable are set 
1c4c0 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c  to 0. Otherwise,
1c4d0 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61   mPrereq is a ma
1c4e0 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63  sk of all FROM c
1c4f0 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  lause.** entries
1c500 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
1c510 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  re the virtual t
1c520 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
1c530 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a   clause and are.
1c540 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  ** separated fro
1c550 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
1c560 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f   one LEFT or CRO
1c570 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72  SS JOIN. Similar
1c580 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73  ly, the.** mUnus
1c590 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  able mask contai
1c5a0 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  ns all FROM clau
1c5b0 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  se entries that 
1c5c0 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a  occur after the.
1c5d0 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1c5e0 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74   and are separat
1c5f0 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1c600 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1c610 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49  or .** CROSS JOI
1c620 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  N. .**.** For ex
1c630 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
1c640 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  ery were:.**.** 
1c650 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74    ... FROM t1, t
1c660 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20  2 LEFT JOIN t3, 
1c670 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49  t4, vt CROSS JOI
1c680 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20  N t5, t6;.**.** 
1c690 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f 72  then mPrereq cor
1c6a0 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c  responds to (t1,
1c6b0 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62   t2) and mUnusab
1c6c0 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a  le to (t5, t6)..
1c6d0 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61  **.** All the ta
1c6e0 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71 20  bles in mPrereq 
1c6f0 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1c700 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
1c710 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74  nt virtual .** t
1c720 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72  able. So any ter
1c730 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c  ms for which all
1c740 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
1c750 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
1c760 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79 20  .** mPrereq may 
1c770 62 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  be specified as 
1c780 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20  "usable" in all 
1c790 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e  calls to xBestIn
1c7a0 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73  dex. .** Convers
1c7b0 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ely, all tables 
1c7c0 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73  in mUnusable mus
1c7d0 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1c7e0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  er the current.*
1c7f0 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  * virtual table,
1c800 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   so any terms fo
1c810 72 20 77 68 69 63 68 20 74 68 65 20 70 72 65 72  r which the prer
1c820 65 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c 61  equisites overla
1c830 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61  p with.** mUnusa
1c840 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ble should alway
1c850 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20  s be configured 
1c860 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20  as "not-usable" 
1c870 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e 0a  for xBestIndex..
1c880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1c890 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1c8a0 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
1c8b0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
1c8c0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
1c8d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
1c8e0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
1c8f0 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eq,             
1c900 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
1c910 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1c920 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 2a  efore this one *
1c930 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75  /.  Bitmask mUnu
1c940 73 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20  sable           
1c950 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
1c960 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1c970 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20 2a  after this one *
1c980 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1c990 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1c9a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1c9b0 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  de */.  WhereInf
1c9c0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
1c9d0 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
1c9e0 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
1c9f0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1ca00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ca10 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1ca20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1ca30 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
1ca40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ca50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1ca60 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1ca70 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
1ca80 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1ca90 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
1caa0 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  h */.  sqlite3_i
1cab0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20  ndex_info *p;   
1cac0 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
1cad0 20 70 61 73 73 20 74 6f 20 78 42 65 73 74 49 6e   pass to xBestIn
1cae0 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  dex() */.  int n
1caf0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
1cb00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cb10 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
1cb20 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62   in p */.  int b
1cb30 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
1cb40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1cb50 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e 28  if plan uses IN(
1cb60 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ...) operator */
1cb70 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1cb80 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42  ew;.  Bitmask mB
1cb90 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
1cba0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73 65     /* Tables use
1cbb0 64 20 62 79 20 62 65 73 74 20 70 6f 73 73 69 62  d by best possib
1cbc0 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36  le plan */.  u16
1cbd0 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 73 74 72 75   mNoOmit;.  stru
1cbe0 63 74 20 42 65 73 74 49 6e 64 65 78 43 74 78 20  ct BestIndexCtx 
1cbf0 62 69 63 3b 0a 20 20 76 6f 69 64 20 2a 70 53 61  bic;.  void *pSa
1cc00 76 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ved;..  assert( 
1cc10 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73  (mPrereq & mUnus
1cc20 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57  able)==0 );.  pW
1cc30 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1cc40 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  >pWInfo;.  pPars
1cc50 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
1cc60 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  se;.  pWC = pBui
1cc70 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65  lder->pWC;.  pNe
1cc80 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1cc90 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57  ew;.  pSrc = &pW
1cca0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1ccb0 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
1ccc0 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
1ccd0 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
1cce0 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65  ;.  p = allocate
1ccf0 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
1cd00 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65  , pWC, mUnusable
1cd10 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72  , pSrc, pBuilder
1cd20 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  ->pOrderBy, .   
1cd30 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20     &mNoOmit);.  
1cd40 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1cd50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1cd60 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  KPT;.  pNew->rSe
1cd70 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
1cd80 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1cd90 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
1cda0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1cdb0 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
1cdc0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1cdd0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1cde0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  p->nConstraint;.
1cdf0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
1ce00 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
1ce10 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
1ce20 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
1ce30 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1ce40 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65  ->db, p);.    re
1ce50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1ce60 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 62  M_BKPT;.  }..  b
1ce70 69 63 2e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  ic.pWC = pWC;.  
1ce80 62 69 63 2e 70 49 64 78 49 6e 66 6f 20 3d 20 70  bic.pIdxInfo = p
1ce90 3b 0a 20 20 62 69 63 2e 70 50 61 72 73 65 20 3d  ;.  bic.pParse =
1cea0 20 70 50 61 72 73 65 3b 0a 20 20 70 53 61 76 65   pParse;.  pSave
1ceb0 64 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  d = pParse->db->
1cec0 70 42 65 73 74 49 6e 64 65 78 43 74 78 3b 0a 20  pBestIndexCtx;. 
1ced0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65   pParse->db->pBe
1cee0 73 74 49 6e 64 65 78 43 74 78 20 3d 20 28 76 6f  stIndexCtx = (vo
1cef0 69 64 2a 29 26 62 69 63 3b 0a 0a 20 20 2f 2a 20  id*)&bic;..  /* 
1cf00 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73 74  First call xBest
1cf10 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c  Index() with all
1cf20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61   constraints usa
1cf30 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54  ble. */.  WHERET
1cf40 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1cf50 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75  irtualOne: all u
1cf60 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63  sable\n"));.  rc
1cf70 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1cf80 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64  irtualOne(pBuild
1cf90 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c  er, mPrereq, ALL
1cfa0 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  BITS, 0, p, mNoO
1cfb0 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f  mit, &bIn);..  /
1cfc0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
1cfd0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69   xBestIndex() wi
1cfe0 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61  th all terms ena
1cff0 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61 20  bled produced a 
1d000 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64  plan.  ** that d
1d010 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
1d020 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c 65  any source table
1d030 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77  s (IOW: a plan w
1d040 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20  ith mBest==0),. 
1d050 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
1d060 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61  s no point in ma
1d070 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65 72  king any further
1d080 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1d090 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e  ndex() .  ** sin
1d0a0 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  ce they will all
1d0b0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
1d0c0 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65 20   result (if the 
1d0d0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20 2a  xBestIndex().  *
1d0e0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1d0f0 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20   is sane). */.  
1d100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d110 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28 70  K && (mBest = (p
1d120 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1d130 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a 20  Prereq))!=0 ){. 
1d140 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20     int seenZero 
1d150 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1d160 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 6c   /* True if a pl
1d170 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65  an with no prere
1d180 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  qs seen */.    i
1d190 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20  nt seenZeroNoIN 
1d1a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1d1b0 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65  Plan with no pre
1d1c0 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e  reqs and no IN(.
1d1d0 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  ..) seen */.    
1d1e0 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20  Bitmask mPrev = 
1d1f0 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  0;.    Bitmask m
1d200 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20  BestNoIn = 0;.. 
1d210 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c 61     /* If the pla
1d220 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68  n produced by th
1d230 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 75  e earlier call u
1d240 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74  ses an IN(...) t
1d250 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  erm, call.    **
1d260 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61 69   xBestIndex agai
1d270 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74  n, this time wit
1d280 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20  h IN(...) terms 
1d290 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
1d2a0 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20 20   if( bIn ){.    
1d2b0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1d2c0 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1d2d0 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f  e: all usable w/
1d2e0 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1d2f0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1d300 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1d310 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1d320 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49  , mPrereq, ALLBI
1d330 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  TS, WO_IN, p, mN
1d340 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1d350 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d      assert( bIn=
1d360 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73  =0 );.      mBes
1d370 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72  tNoIn = pNew->pr
1d380 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b  ereq & ~mPrereq;
1d390 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74  .      if( mBest
1d3a0 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIn==0 ){.     
1d3b0 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1d3c0 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1d3d0 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  oNoIN = 1;.     
1d3e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d3f0 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   Call xBestIndex
1d400 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64   once for each d
1d410 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66  istinct value of
1d420 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26 20   (prereqRight & 
1d430 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a  ~mPrereq) .    *
1d440 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  * in the set of 
1d450 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79  terms that apply
1d460 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1d470 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
1d480 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  */.    while( rc
1d490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d4a0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1d4b0 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20    Bitmask mNext 
1d4c0 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20  = ALLBITS;.     
1d4d0 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30   assert( mNext>0
1d4e0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1d4f0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1d500 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1d510 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20  Bitmask mThis = 
1d520 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57  (.            pW
1d530 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61  C->a[p->aConstra
1d540 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
1d550 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20  et].prereqRight 
1d560 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20  & ~mPrereq.     
1d570 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1d580 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26  ( mThis>mPrev &&
1d590 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d   mThis<mNext ) m
1d5a0 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20  Next = mThis;.  
1d5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65      }.      mPre
1d5c0 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20  v = mNext;.     
1d5d0 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42   if( mNext==ALLB
1d5e0 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ITS ) break;.   
1d5f0 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42     if( mNext==mB
1d600 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42  est || mNext==mB
1d610 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e  estNoIn ) contin
1d620 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
1d630 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1d640 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76  irtualOne: mPrev
1d650 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30  =%04llx mNext=%0
1d660 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  4llx\n",.       
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1d690 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f  mPrev, (sqlite3_
1d6a0 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a  uint64)mNext));.
1d6b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1d6c0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1d6d0 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  e(.          pBu
1d6e0 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1d6f0 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20 30  mNext|mPrereq, 0
1d700 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1d710 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  In);.      if( p
1d720 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72  New->prereq==mPr
1d730 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ereq ){.        
1d740 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1d750 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30        if( bIn==0
1d760 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20   ) seenZeroNoIN 
1d770 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1d780 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d790 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1d7a0 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20 61  Index() in the a
1d7b0 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f  bove loop did no
1d7c0 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20  t find a plan.  
1d7d0 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72    ** that requir
1d7e0 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62  es no source tab
1d7f0 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e  les at all (i.e.
1d800 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64 20   one guaranteed 
1d810 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73 61  to be.    ** usa
1d820 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c  ble), make a cal
1d830 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c 20  l here with all 
1d840 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64 69  source tables di
1d850 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  sabled */.    if
1d860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d870 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29  && seenZero==0 )
1d880 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1d890 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1d8a0 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73  tualOne: all dis
1d8b0 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20  abled\n"));.    
1d8c0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d8d0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1d8e0 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1d8f0 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65  r, mPrereq, mPre
1d900 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d  req, 0, p, mNoOm
1d910 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1d920 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65   if( bIn==0 ) se
1d930 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1d940 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d950 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42   the calls to xB
1d960 65 73 74 49 6e 64 65 78 28 29 20 68 61 76 65 20  estIndex() have 
1d970 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f  so far failed to
1d980 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20   find a plan.   
1d990 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65   ** that require
1d9a0 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c  s no source tabl
1d9b0 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f  es at all and do
1d9c0 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e  es not use an IN
1d9d0 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65  (...).    ** ope
1d9e0 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69  rator, make a fi
1d9f0 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61  nal call to obta
1da00 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f  in one here.  */
1da10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1da20 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65  ITE_OK && seenZe
1da30 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20  roNoIN==0 ){.   
1da40 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1da50 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1da60 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64  ne: all disabled
1da70 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29   and w/o IN\n"))
1da80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1da90 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1daa0 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1dab0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1dac0 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e  , mPrereq, WO_IN
1dad0 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1dae0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  In);.    }.  }..
1daf0 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46    if( p->needToF
1db00 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
1db10 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53  te3_free(p->idxS
1db20 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
1db30 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64  FreeNN(pParse->d
1db40 62 2c 20 70 29 3b 0a 20 20 70 50 61 72 73 65 2d  b, p);.  pParse-
1db50 3e 64 62 2d 3e 70 42 65 73 74 49 6e 64 65 78 43  >db->pBestIndexC
1db60 74 78 20 3d 20 70 53 61 76 65 64 3b 0a 20 20 72  tx = pSaved;.  r
1db70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1db80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1db90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1dba0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
1dbb0 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
1dbc0 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
1dbd0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
1dbe0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
1dbf0 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
1dc00 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1dc10 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
1dc20 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dOr(.  WhereLoop
1dc30 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1dc40 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  r, .  Bitmask mP
1dc50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61 73  rereq, .  Bitmas
1dc60 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20  k mUnusable.){. 
1dc70 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1dc80 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1dc90 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
1dca0 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
1dcb0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1dcc0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1dcd0 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
1dce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dcf0 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
1dd00 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
1dd10 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
1dd20 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
1dd30 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53  .  WhereOrSet sS
1dd40 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75  um, sCur;.  stru
1dd50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1dd60 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
1dd70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1dd80 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
1dd90 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
1dda0 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
1ddb0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d  der->pNew;.  mem
1ddc0 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69  set(&sSum, 0, si
1ddd0 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70  zeof(sSum));.  p
1dde0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
1ddf0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
1de00 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20  w->iTab;.  iCur 
1de10 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
1de20 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
1de30 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
1de40 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
1de50 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
1de60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1de70 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
1de80 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
1de90 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1dea0 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
1deb0 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
1dec0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
1ded0 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
1dee0 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
1def0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
1df00 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1df10 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
1df20 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
1df30 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
1df40 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
1df50 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
1df60 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
1df70 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
1df80 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
1df90 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
1dfa0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
1dfb0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
1dfc0 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65   sSubBuild.pOrSe
1dfd0 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20  t = &sCur;..    
1dfe0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1dff0 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63  00, ("Begin proc
1e000 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
1e010 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
1e020 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
1e030 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
1e040 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
1e050 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
1e060 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
1e070 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e080 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
1e090 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1e0a0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
1e0b0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
1e0c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e0d0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
1e0e0 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
1e0f0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1e100 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
1e110 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
1e120 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
1e130 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
1e140 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
1e150 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1e160 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
1e170 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
1e180 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
1e190 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1e1a0 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
1e1b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e1c0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1e1d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e1e0 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
1e1f0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
1e200 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
1e210 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1e220 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64  00, ("OR-term %d
1e230 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75   of %p has %d su
1e240 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20  bterms:\n", .   
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f  (int)(pOrTerm-pO
1e270 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20  rWC->a), pTerm, 
1e280 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e  sSubBuild.pWC->n
1e290 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
1e2a0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
1e2b0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
1e2c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e2d0 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
1e2e0 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57 43  nt(sSubBuild.pWC
1e2f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
1e300 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1e310 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e320 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
1e330 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
1e340 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
1e350 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1e360 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
1e370 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65  SubBuild, mPrere
1e380 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1e390 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
1e3a0 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
1e3b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1e3c0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
1e3d0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1e3e0 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eq);.        }. 
1e3f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1e400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e410 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e420 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42  LoopAddOr(&sSubB
1e430 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d  uild, mPrereq, m
1e440 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20  Unusable);.     
1e450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1e460 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1e470 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
1e480 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1e490 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
1e4a0 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
1e4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1e4c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1e4d0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1e4e0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1e4f0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
1e500 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
1e510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1e520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57  lse{.          W
1e530 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b  hereOrSet sPrev;
1e540 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1e550 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
1e560 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
1e570 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1e580 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1e590 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
1e5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
1e5b0 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
1e5c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1e5d0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
1e5e0 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
1e5f0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
1e600 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e620 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e630 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1e640 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
1e650 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e680 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1e690 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
1e6a0 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
1e6b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e6d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1e6e0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
1e6f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
1e700 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
1e710 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
1e720 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
1e730 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
1e740 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1e750 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1e760 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
1e770 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
1e780 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
1e790 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
1e7a0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1e7b0 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
1e7c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
1e7d0 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c  TUNING: Currentl
1e7e0 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  y sSum.a[i].rRun
1e7f0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
1e800 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  um of the costs.
1e810 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c          ** of al
1e820 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75  l sub-scans requ
1e830 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73  ired by the OR-s
1e840 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75  can. However, du
1e850 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20  e to rounding.  
1e860 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c        ** errors,
1e870 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
1e880 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
1e890 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c  OR-scan is equal
1e8a0 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20   to its.        
1e8b0 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76  ** most expensiv
1e8c0 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20  e sub-scan. Add 
1e8d0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
1e8e0 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20  sible penalty . 
1e8f0 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76         ** (equiv
1e900 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c  alent to multipl
1e910 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79  ying the cost by
1e920 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65   1.07) to ensure
1e930 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a   that .        *
1e940 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  * this does not 
1e950 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73  happen. Otherwis
1e960 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  e, for WHERE cla
1e970 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  uses such as the
1e980 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
1e990 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72  owing where ther
1e9a0 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1e9b0 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a   "y":.        **
1e9c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
1e9d0 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
1e9e0 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79  (x=?, 0.99) OR y
1e9f0 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  =?.        **.  
1ea00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61        ** the pla
1ea10 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74  nner may elect t
1ea20 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20  o "OR" together 
1ea30 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
1ea40 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20  n and an.       
1ea50 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70   ** index lookup
1ea60 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69  . And other simi
1ea70 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74  larly odd result
1ea80 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  s.  */.        p
1ea90 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
1eaa0 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a  .a[i].rRun + 1;.
1eab0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
1eac0 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
1ead0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
1eae0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
1eaf0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
1eb00 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1eb10 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1eb20 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1eb30 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54    }.      WHERET
1eb40 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e  RACE(0x200, ("En
1eb50 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d  d processing OR-
1eb60 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54  clause %p\n", pT
1eb70 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  erm));.    }.  }
1eb80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1eb90 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
1eba0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1ebb0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
1ebc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1ebd0 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
1ebe0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1ebf0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
1ec00 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1ec10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1ec20 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  fo;.  Bitmask mP
1ec30 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69 74  rereq = 0;.  Bit
1ec40 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
1ec50 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
1ec60 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1ec70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1ec80 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1ec90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1eca0 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  m;.  struct SrcL
1ecb0 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d  ist_item *pEnd =
1ecc0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57   &pTabList->a[pW
1ecd0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  Info->nLevel];. 
1ece0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1ecf0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1ed00 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
1ed10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65  LITE_OK;.  Where
1ed20 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38  Loop *pNew;.  u8
1ed30 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1ed40 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   0;..  /* Loop o
1ed50 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
1ed60 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
1ed70 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
1ed80 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  /.  pNew = pBuil
1ed90 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65  der->pNew;.  whe
1eda0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29  reLoopInit(pNew)
1edb0 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20  ;.  for(iTab=0, 
1edc0 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pItem=pTabList->
1edd0 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69  a; pItem<pEnd; i
1ede0 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
1edf0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  .    Bitmask mUn
1ee00 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
1ee10 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
1ee20 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
1ee30 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57  kSelf = sqlite3W
1ee40 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
1ee50 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
1ee60 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1ee70 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d      if( ((pItem-
1ee80 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  >fg.jointype|pri
1ee90 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a  orJointype) & (J
1eea0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
1eeb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
1eec0 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
1eed0 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74  is true when pIt
1eee0 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63  em is the FROM c
1eef0 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68  lause term on th
1ef00 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74  e.      ** right
1ef10 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20  -hand-side of a 
1ef20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1ef30 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50  IN.  */.      mP
1ef40 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a  rereq = mPrior;.
1ef50 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
1ef60 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d  ointype = pItem-
1ef70 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69  >fg.jointype;.#i
1ef80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ef90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1efa0 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
1efb0 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
1efc0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
1efd0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20  cList_item *p;. 
1efe0 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65       for(p=&pIte
1eff0 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  m[1]; p<pEnd; p+
1f000 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1f010 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d  mUnusable || (p-
1f020 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28  >fg.jointype & (
1f030 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1f040 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
1f050 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c  mUnusable |= sql
1f060 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
1f070 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1f080 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b  et, p->iCursor);
1f090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f0a0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68   }.      rc = wh
1f0b0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1f0c0 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  l(pBuilder, mPre
1f0d0 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1f0e0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
1f0f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1f100 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1f110 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
1f120 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1f130 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50  ree(pBuilder, mP
1f140 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20  rereq);.    }.  
1f150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1f170 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1f180 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1f190 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1f1a0 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
1f1b0 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
1f1c0 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
1f1d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f1e0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
1f1f0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
1f200 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
1f210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f220 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
1f230 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
1f240 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
1f250 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
1f260 20 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a 20 70   of the 6th.** p
1f270 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
1f280 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
1f290 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
1f2a0 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
1f2b0 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
1f2c0 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
1f2d0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
1f2e0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
1f2f0 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
1f300 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
1f310 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1f320 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
1f330 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
1f340 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
1f350 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f360 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1f370 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
1f380 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
1f390 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
1f3a0 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
1f3b0 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
1f3c0 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
1f3d0 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
1f3e0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
1f3f0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
1f400 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
1f410 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
1f420 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
1f430 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
1f440 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
1f450 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
1f460 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
1f470 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
1f480 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
1f490 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
1f4a0 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
1f4b0 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
1f4c0 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
1f4d0 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
1f4e0 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
1f4f0 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
1f500 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
1f510 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
1f520 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
1f530 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
1f540 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
1f550 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
1f560 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
1f570 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
1f580 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
1f590 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
1f5a0 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
1f5b0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1f5c0 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
1f5d0 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
1f5e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f5f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
1f600 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1f610 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1f620 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
1f630 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
1f640 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
1f650 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
1f660 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
1f670 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
1f680 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
1f690 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1f6a0 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ,       /* WHERE
1f6b0 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53  _GROUPBY or _DIS
1f6c0 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45  TINCTBY or _ORDE
1f6d0 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75  RBY_LIMIT */.  u
1f6e0 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
1f6f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f700 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
1f710 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
1f720 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
1f730 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
1f740 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
1f750 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
1f760 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
1f770 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
1f780 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
1f790 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
1f7a0 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
1f7b0 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
1f7c0 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
1f7d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f7e0 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
1f7f0 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
1f800 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1f810 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
1f820 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
1f830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f840 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
1f850 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
1f860 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
1f870 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
1f880 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
1f890 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
1f8a0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
1f8b0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1f8c0 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
1f8d0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
1f8e0 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
1f8f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
1f900 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
1f910 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
1f920 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1f930 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20    u16 eqOpMask; 
1f940 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
1f950 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  ed equality oper
1f960 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e  ators */.  u16 n
1f970 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
1f980 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
1f990 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
1f9a0 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
1f9b0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
1f9c0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1f9d0 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
1f9e0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
1f9f0 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
1fa00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1fa10 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
1fa20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fa30 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fa50 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
1fa60 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
1fa70 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1fa80 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1fa90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1faa0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
1fab0 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
1fac0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
1fad0 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
1fae0 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
1faf0 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
1fb00 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
1fb10 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
1fb20 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
1fb30 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1fb40 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
1fb50 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
1fb60 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
1fb70 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1fb80 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1fb90 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1fba0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1fbb0 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
1fbc0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
1fbd0 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
1fbe0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1fbf0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
1fc00 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
1fc10 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
1fc20 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
1fc30 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1fc40 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1fc50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1fc60 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1fc70 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
1fc80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
1fc90 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
1fca0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1fcb0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
1fcc0 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
1fcd0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
1fce0 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
1fcf0 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
1fd00 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
1fd10 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
1fd20 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
1fd30 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
1fd40 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
1fd50 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
1fd60 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
1fd70 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
1fd80 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
1fd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fda0 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
1fdb0 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
1fdc0 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
1fdd0 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
1fde0 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
1fdf0 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
1fe00 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
1fe10 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
1fe20 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
1fe30 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1fe40 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1fe50 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
1fe60 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
1fe70 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
1fe80 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
1fe90 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
1fea0 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
1feb0 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
1fec0 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
1fed0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
1fee0 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
1fef0 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
1ff00 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
1ff10 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
1ff20 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
1ff30 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
1ff40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
1ff50 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
1ff60 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
1ff70 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
1ff80 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
1ff90 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
1ffa0 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
1ffb0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1ffc0 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
1ffd0 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
1ffe0 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
1fff0 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
20000 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
20010 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
20020 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
20030 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
20040 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
20050 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
20060 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
20070 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
20080 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
20090 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
200a0 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
200b0 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
200c0 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
200d0 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
200e0 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
200f0 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
20100 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
20110 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
20120 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
20130 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
20140 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
20150 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
20160 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
20170 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
20180 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
20190 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
201a0 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
201b0 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
201c0 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
201d0 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
201e0 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
201f0 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
20200 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
20210 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
20220 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
20230 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
20240 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
20250 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
20260 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
20270 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  0 );.  if( nLoop
20280 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
20290 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
202a0 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
202b0 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
202c0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
202d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
202e0 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
202f0 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
20300 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
20310 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
20320 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
20330 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
20340 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
20350 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
20360 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
20370 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
20380 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
20390 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
203a0 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70  eady = 0;.  eqOp
203b0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57  Mask = WO_EQ | W
203c0 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c  O_IS | WO_ISNULL
203d0 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ;.  if( wctrlFla
203e0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
203f0 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d  BY_LIMIT ) eqOpM
20400 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20  ask |= WO_IN;.  
20410 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
20420 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
20430 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
20440 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
20450 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
20460 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
20470 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
20480 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  lf;.    if( iLoo
20490 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  p<nLoop ){.     
204a0 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e   pLoop = pPath->
204b0 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
204c0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
204d0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
204e0 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69  BY_LIMIT ) conti
204f0 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nue;.    }else{.
20500 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c        pLoop = pL
20510 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ast;.    }.    i
20520 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
20530 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
20540 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  LTABLE ){.      
20550 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  if( pLoop->u.vta
20560 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62  b.isOrdered ) ob
20570 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20  Sat = obDone;.  
20580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20590 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  else{.      pLoo
205a0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43  p->u.btree.nIdxC
205b0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
205c0 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
205d0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
205e0 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
205f0 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
20600 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
20610 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
20620 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
20630 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
20640 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
20650 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
20660 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
20670 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
20680 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
20690 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
206a0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
206b0 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
206c0 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
206d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
206e0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
206f0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
20700 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
20710 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
20720 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
20730 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
20740 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
20750 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
20760 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
20770 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
20780 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
20790 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
207a0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
207b0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
207c0 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
207d0 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  m(&pWInfo->sWC, 
207e0 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69  iCur, pOBExpr->i
207f0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
20810 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c  ready, eqOpMask,
20820 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
20830 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
20840 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
20850 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
20860 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
20870 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65   /* IN terms are
20880 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
20890 73 6f 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f  sorting in the O
208a0 52 44 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20  RDER BY LIMIT . 
208b0 20 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69         ** optimi
208c0 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e  zation, and then
208d0 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72   only if they ar
208e0 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a  e actually used.
208f0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68          ** by th
20900 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  e query plan */.
20910 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20920 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
20930 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
20940 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
20950 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c  j=0; j<pLoop->nL
20960 54 65 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70  Term && pTerm!=p
20970 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
20980 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
20990 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c  if( j>=pLoop->nL
209a0 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
209b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
209c0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
209d0 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49  ator&(WO_EQ|WO_I
209e0 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  S))!=0 && pOBExp
209f0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
20a00 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
20a10 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20  har *z1, *z2;.  
20a20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
20a30 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20a40 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
20a50 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
20a60 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20a70 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
20a80 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
20a90 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ll;.        z1 =
20aa0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
20ab0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
20ac0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
20ad0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
20ae0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
20af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
20b00 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
20b10 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
20b20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d       z2 = pColl-
20b30 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
20b40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
20b50 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20  mp(z1, z2)!=0 ) 
20b60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20b70 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
20b80 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
20b90 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _IS );.      }. 
20ba0 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
20bb0 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
20bc0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
20bd0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
20be0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
20bf0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
20c00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20c10 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
20c20 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
20c30 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a     nKeyCol = 0;.
20c40 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
20c50 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
20c60 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70   if( (pIndex = p
20c70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
20c80 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64  ndex)==0 || pInd
20c90 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
20ca0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20cb0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
20cc0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
20cd0 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   = pIndex->nKeyC
20ce0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  ol;.        nCol
20cf0 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43  umn = pIndex->nC
20d00 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61  olumn;.        a
20d10 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
20d20 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61  nKeyCol+1 || !Ha
20d30 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
20d40 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20  Table) );.      
20d50 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
20d60 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
20d70 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a  mn-1]==XN_ROWID.
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61            || !Ha
20da0 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70  sRowid(pIndex->p
20db0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  Table));.       
20dc0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
20dd0 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78   = IsUniqueIndex
20de0 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
20df0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  }..      /* Loop
20e00 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c   through all col
20e10 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
20e20 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20  x and deal with 
20e30 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a  the ones.      *
20e40 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63  * that are not c
20e50 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
20e60 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f   or IN..      */
20e70 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76  .      rev = rev
20e80 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  Set = 0;.      d
20e90 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d  istinctColumns =
20ea0 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
20eb0 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  0; j<nColumn; j+
20ec0 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  +){.        u8 b
20ed0 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75  Once = 1; /* Tru
20ee0 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44  e to run the ORD
20ef0 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f  ER BY search loo
20f00 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73  p */..        as
20f10 73 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e  sert( j>=pLoop->
20f20 75 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20  u.btree.nEq .   
20f30 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f           || (pLo
20f40 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30  op->aLTerm[j]==0
20f50 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b  )==(j<pLoop->nSk
20f60 69 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ip).        );. 
20f70 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f         if( j<pLo
20f80 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
20f90 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b  && j>=pLoop->nSk
20fa0 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
20fb0 75 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d  u16 eOp = pLoop-
20fc0 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65  >aLTerm[j]->eOpe
20fd0 72 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20  rator;..        
20fe0 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
20ff0 3d 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e  = and IS and ISN
21000 55 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73  ULL terms.  (Als
21010 6f 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20  o skip IN terms 
21020 77 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  when.          *
21030 2a 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52  * doing WHERE_OR
21040 44 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63  DERBY_LIMIT proc
21050 65 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20  essing). .      
21060 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
21070 20 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   ** If the curre
21080 6e 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c  nt term is a col
21090 75 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29  umn of an ((?,?)
210a0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29   IN (SELECT...))
210b0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65   .          ** e
210c0 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68  xpression for wh
210d0 69 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72  ich the SELECT r
210e0 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
210f0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20   one column,.   
21100 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20         ** check 
21110 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f  that it is the o
21120 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20  nly column used 
21130 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74  by this loop. Ot
21140 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20  herwise,.       
21150 20 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f     ** if it is o
21160 6e 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ne of two or mor
21170 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63  e, none of the c
21180 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20  olumns can be.  
21190 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69          ** consi
211a0 64 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61  dered to match a
211b0 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e  n ORDER BY term.
211c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
211d0 66 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61  f( (eOp & eqOpMa
211e0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
211f0 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20        if( eOp & 
21200 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
21210 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
21220 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
21230 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
21240 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
21250 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
21260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21270 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
21280 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21290 20 69 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20   if( ALWAYS(eOp 
212a0 26 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20  & WO_IN) ){.    
212b0 20 20 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59          /* ALWAY
212c0 53 28 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f  S() justificatio
212d0 6e 3a 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75  n: eOp is an equ
212e0 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64  ality operator d
212f0 75 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ue to the.      
21300 20 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70        ** j<pLoop
21310 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f  ->u.btree.nEq co
21320 6e 73 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20  nstraint above. 
21330 20 41 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74   Any equality ot
21340 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
21350 2a 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73  ** than WO_IN is
21360 20 63 61 70 74 75 72 65 64 20 62 79 20 74 68 65   captured by the
21370 20 70 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20   previous "if". 
21380 20 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20   So this one.   
21390 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
213a0 79 73 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f  ys has to be WO_
213b0 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  IN. */.         
213c0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c     Expr *pX = pL
213d0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
213e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
213f0 20 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c     for(i=j+1; i<
21400 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
21410 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Eq; i++){.      
21420 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f          if( pLoo
21430 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45  p->aLTerm[i]->pE
21440 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20  xpr==pX ){.     
21450 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
21460 74 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t( (pLoop->aLTer
21470 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  m[i]->eOperator 
21480 26 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20  & WO_IN) );.    
21490 20 20 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63              bOnc
214a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
214b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
214d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
214e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
214f0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
21500 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
21510 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
21520 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
21530 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
21540 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
21550 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
21560 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
21570 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21580 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b     if( pIndex ){
21590 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
215a0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
215b0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
215c0 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
215d0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
215e0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
215f0 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
21600 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
21610 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b   ) iColumn = -1;
21620 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21630 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
21640 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  n = XN_ROWID;.  
21650 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
21660 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
21670 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63         /* An unc
21680 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d  onstrained colum
21690 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  n that might be 
216a0 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  NULL means that 
216b0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
216c0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74  WhereLoop is not
216d0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20   well-ordered.  
216e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
216f0 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
21700 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
21710 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
21720 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
21730 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
21740 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
21750 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
21760 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
21770 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
21780 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
21790 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
217a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
217b0 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
217c0 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
217d0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
217e0 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
217f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
21800 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74  index and mark t
21810 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72  hat ORDER BY ter
21820 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a  m off .        *
21830 2f 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  /.        isMatc
21840 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  h = 0;.        f
21850 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26  or(i=0; bOnce &&
21860 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
21870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21880 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
21890 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
218a0 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70            pOBExp
218b0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
218c0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
218d0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
218e0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
218f0 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
21900 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
21910 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
21920 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
21930 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
21940 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20  NCTBY );.       
21950 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
21960 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
21970 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
21980 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
21990 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
219a0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 28 2d   if( iColumn>=(-
219b0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
219c0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
219d0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
219e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
219f0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
21a00 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
21a10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21a20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
21a30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
21a40 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
21a50 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
21a70 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
21a80 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70 49 6e  pare(pOBExpr,pIn
21a90 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  dex->aColExpr->a
21aa0 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 29 20  [j].pExpr,iCur) 
21ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21ac0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
21af0 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
21b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
21b10 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
21b20 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
21b30 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
21b40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21b50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
21b60 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
21b70 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
21b80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
21b90 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
21ba0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
21bb0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
21bc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
21bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21be0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
21bf0 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 6a 2b 31  ee.nIdxCol = j+1
21c00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  ;.          isMa
21c10 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
21c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21c30 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21c40 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74 72  isMatch && (wctr
21c50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
21c60 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20  ROUPBY)==0 ){.  
21c70 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
21c80 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72  sure the sort or
21c90 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  der is compatibl
21ca0 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  e in an ORDER BY
21cb0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20   clause..       
21cc0 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72     ** Sort order
21cd0 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66   is irrelevant f
21ce0 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
21cf0 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ause. */.       
21d00 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
21d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21d20 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21   (rev ^ revIdx)!
21d30 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  =pOrderBy->a[i].
21d40 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d 61  sortOrder ) isMa
21d50 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
21d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21d70 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 49        rev = revI
21d80 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61  dx ^ pOrderBy->a
21d90 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
21da0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
21db0 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c  ev ) *pRevMask |
21dc0 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29  = MASKBIT(iLoop)
21dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
21de0 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
21df0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21e00 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
21e10 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
21e20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e   if( iColumn==XN
21e30 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
21e40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21e50 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
21e60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
21e70 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
21e80 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
21e90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
21ea0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
21eb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21ec0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
21ed0 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
21ee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
21ef0 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
21f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
21f10 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
21f20 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
21f30 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
21f40 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
21f50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
21f80 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
21f90 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
21fa0 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
21fb0 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
21fc0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
21fd0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
21fe0 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
21ff0 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
22000 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
22010 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
22020 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
22030 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
22040 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
22050 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
22060 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
22070 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
22080 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
22090 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
220a0 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
220b0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
220c0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
220d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
220e0 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
220f0 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
22100 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
22110 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
22120 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22130 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
22140 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
22150 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c       mTerm = sql
22160 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
22170 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ge(&pWInfo->sMas
22180 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20  kSet,p);.       
22190 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26   if( mTerm==0 &&
221a0 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
221b0 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e  onstant(p) ) con
221c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
221d0 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72  f( (mTerm&~order
221e0 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
221f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
22200 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
22210 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22220 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
22230 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
22240 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
22250 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
22260 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
22270 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
22280 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
22290 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72  eturn (i8)nOrder
222a0 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64  By;.  if( !isOrd
222b0 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
222c0 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79    for(i=nOrderBy
222d0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
222e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
222f0 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b   MASKBIT(i) - 1;
22300 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61  .      if( (obSa
22310 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e  t&m)==m ) return
22320 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   i;.    }.    re
22330 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
22340 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn -1;.}.../*.
22350 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f  ** If the WHERE_
22360 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
22370 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20  set in the mask 
22380 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
22390 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a  3WhereBegin(),.*
223a0 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73  * the planner as
223b0 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73  sumes that the s
223c0 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42  pecified pOrderB
223d0 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c  y list is actual
223e0 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59  ly a GROUP.** BY
223f0 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f   clause - and so
22400 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20   any order that 
22410 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72  groups rows as r
22420 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65  equired satisfie
22430 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  s the.** request
22440 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
22450 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  , in this case i
22460 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
22470 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  e for the caller
22480 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
22490 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
224a0 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61  the rows are rea
224b0 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65  lly being delive
224c0 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  red in sorted or
224d0 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20  der, or.** just 
224e0 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72  in some other or
224f0 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65  der that provide
22500 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67  s the required g
22510 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72  rouping. However
22520 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  ,.** if the WHER
22530 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c  E_SORTBYGROUP fl
22540 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65  ag is also passe
22550 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
22560 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a  eBegin(), then.*
22570 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
22580 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
22590 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68   the returned Wh
225a0 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  ereInfo object. 
225b0 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72  It returns.** tr
225c0 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72  ue if the rows r
225d0 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f  eally will be so
225e0 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  rted in the spec
225f0 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20  ified order, or 
22600 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69  false.** otherwi
22610 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  se..**.** For ex
22620 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a  ample, assuming:
22630 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
22640 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78  INDEX i1 ON t1(x
22650 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , Y);.**.** then
22660 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
22670 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
22680 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20  BY x,y ORDER BY 
22690 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  x,y;   -- IsSort
226a0 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c  ed()==1.**   SEL
226b0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
226c0 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52  OUP BY y,x ORDER
226d0 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73   BY y,x;   -- Is
226e0 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69  Sorted()==0.*/.i
226f0 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
22700 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66  sSorted(WhereInf
22710 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
22720 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
22730 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
22740 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73  _GROUPBY );.  as
22750 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
22760 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
22770 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a  _SORTBYGROUP );.
22780 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
22790 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64  >sorted;.}..#ifd
227a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
227b0 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
227c0 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
227d0 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
227e0 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
227f0 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
22800 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
22810 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
22820 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
22830 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
22840 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
22850 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
22860 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
22870 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
22880 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
22890 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
228a0 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
228b0 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
228c0 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
228d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
228e0 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f  n the cost of so
228f0 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c  rting nRow rows,
22900 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
22910 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a  he keys have .**
22920 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e   nOrderby column
22930 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66  s and that the f
22940 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c  irst nSorted col
22950 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79  umns are already
22960 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f   in.** order..*/
22970 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
22980 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28  hereSortingCost(
22990 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
229a0 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e  Info,.  LogEst n
229b0 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65  Row,.  int nOrde
229c0 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74  rBy,.  int nSort
229d0 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e  ed.){.  /* TUNIN
229e0 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73  G: Estimated cos
229f0 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65  t of a full exte
22a00 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65  rnal sort, where
22a10 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20   N is .  ** the 
22a20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
22a30 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a  o sort is:.  **.
22a40 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
22a50 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
22a60 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c  ..  ** .  ** Or,
22a70 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   if the order-by
22a80 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65   clause has X te
22a90 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65  rms but only the
22aa0 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65   last Y .  ** te
22ab0 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f  rms are out of o
22ac0 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b  rder, then block
22ad0 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65  -sorting will re
22ae0 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73  duce the .  ** s
22af0 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a  orting cost to:.
22b00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74    **.  **   cost
22b10 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f   = (3.0 * N * lo
22b20 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20  g(N)) * (Y/X).  
22b30 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58  **.  ** The (Y/X
22b40 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d  ) term is implem
22b50 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63  ented using stac
22b60 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c  k variable rScal
22b70 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a  e.  ** below.  *
22b80 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c  /.  LogEst rScal
22b90 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20  e, rSortCost;.  
22ba0 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
22bb0 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65  >0 && 66==sqlite
22bc0 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
22bd0 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74    rScale = sqlit
22be0 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72  e3LogEst((nOrder
22bf0 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f  By-nSorted)*100/
22c00 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a  nOrderBy) - 66;.
22c10 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
22c20 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36  ow + rScale + 16
22c30 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65  ;..  /* Multiple
22c40 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65   by log(M) where
22c50 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   M is the number
22c60 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e   of output rows.
22c70 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49  .  ** Use the LI
22c80 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20  MIT for M if it 
22c90 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  is smaller */.  
22ca0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
22cb0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22cc0 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26  USE_LIMIT)!=0 &&
22cd0 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c   pWInfo->iLimit<
22ce0 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77  nRow ){.    nRow
22cf0 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69   = pWInfo->iLimi
22d00 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f  t;.  }.  rSortCo
22d10 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f  st += estLog(nRo
22d20 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f  w);.  return rSo
22d30 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rtCost;.}../*.**
22d40 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
22d50 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
22d60 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
22d70 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
22d80 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
22d90 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
22da0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
22db0 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
22dc0 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
22dd0 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
22de0 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
22df0 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
22e00 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
22e10 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
22e20 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
22e30 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
22e40 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
22e50 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
22e60 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
22e70 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
22e80 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
22e90 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
22ea0 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
22eb0 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
22ec0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
22ed0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
22ee0 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
22ef0 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
22f00 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
22f10 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
22f20 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
22f30 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
22f40 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20  *pWInfo, LogEst 
22f50 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20  nRowEst){.  int 
22f60 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20  mxChoice;       
22f70 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
22f80 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
22f90 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
22fa0 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
22fb0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
22fc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22fd0 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
22fe0 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  oin */.  Parse *
22ff0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
23000 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23010 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
23020 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
23030 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
23040 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23050 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23070 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f  * Loop counter o
23080 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  ver the terms of
23090 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69   the join */.  i
230a0 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20  nt ii, jj;      
230b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
230c0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
230d0 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20  nt mxI = 0;     
230e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
230f0 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20  x of next entry 
23100 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20  to replace */.  
23110 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
23120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23130 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
23140 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
23150 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20    LogEst mxCost 
23160 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
23170 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
23180 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
23190 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f  .  LogEst mxUnso
231a0 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  rted = 0;    /* 
231b0 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64  Maximum unsorted
231c0 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
231d0 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  f path */.  int 
231e0 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20  nTo, nFrom;     
231f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23200 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73  of valid entries
23210 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46   in aTo[] and aF
23220 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  rom[] */.  Where
23230 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20  Path *aFrom;    
23240 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f       /* All nFro
23250 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70  m paths at the p
23260 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f  revious level */
23270 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54  .  WherePath *aT
23280 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
23290 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74  The nTo best pat
232a0 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  hs at the curren
232b0 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  t level */.  Whe
232c0 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20  rePath *pFrom;  
232d0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
232e0 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20  ment of aFrom[] 
232f0 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
23300 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
23310 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20  ePath *pTo;     
23320 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
23330 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61  ent of aTo[] tha
23340 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
23350 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   on */.  WhereLo
23360 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20  op *pWLoop;     
23370 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
23380 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
23390 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ts */.  WhereLoo
233a0 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20  p **pX;         
233b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76    /* Used to div
233c0 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20  y up the pSpace 
233d0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45  memory */.  LogE
233e0 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20  st *aSortCost = 
233f0 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67  0;    /* Sorting
23400 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72   and partial sor
23410 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20  ting costs */.  
23420 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20  char *pSpace;   
23430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
23440 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73  porary memory us
23450 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
23460 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  ne */.  int nSpa
23470 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
23480 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
23490 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  ace allocated at
234a0 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50   pSpace */..  pP
234b0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
234c0 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
234d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f  arse->db;.  nLoo
234e0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  p = pWInfo->nLev
234f0 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  el;.  /* TUNING:
23500 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72   For simple quer
23510 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65  ies, only the be
23520 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b  st path is track
23530 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77  ed..  ** For 2-w
23540 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20  ay joins, the 5 
23550 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66  best paths are f
23560 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f  ollowed..  ** Fo
23570 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20  r joins of 3 or 
23580 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61  more tables, tra
23590 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70  ck the 10 best p
235a0 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69  aths */.  mxChoi
235b0 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20  ce = (nLoop<=1) 
235c0 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20  ? 1 : (nLoop==2 
235d0 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73  ? 5 : 10);.  ass
235e0 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e  ert( nLoop<=pWIn
235f0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
23600 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41  rc );.  WHERETRA
23610 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d  CE(0x002, ("----
23620 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20   begin solver.  
23630 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c  (nRowEst=%d)\n",
23640 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f   nRowEst));..  /
23650 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20  * If nRowEst is 
23660 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69  zero and there i
23670 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
23680 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e  ause, ignore it.
23690 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   In this.  ** ca
236a0 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  se the purpose o
236b0 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74  f this call is t
236c0 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
236d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65  umber of rows re
236e0 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74  turned.  ** by t
236f0 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79  he overall query
23700 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69  . Once this esti
23710 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62  mate has been ob
23720 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  tained, the call
23730 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76  er.  ** will inv
23740 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
23750 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c  n a second time,
23760 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74   passing the est
23770 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a  imate as the.  *
23780 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65  * nRowEst parame
23790 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ter.  */.  if( p
237a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
237b0 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30  =0 || nRowEst==0
237c0 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   ){.    nOrderBy
237d0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
237e0 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57     nOrderBy = pW
237f0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
23800 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nExpr;.  }..  /*
23810 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
23820 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66  itialize space f
23830 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e  or aTo, aFrom an
23840 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f  d aSortCost[] */
23850 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a  .  nSpace = (siz
23860 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
23870 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
23880 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
23890 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d  e*2;.  nSpace +=
238a0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
238b0 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53  * nOrderBy;.  pS
238c0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
238d0 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
238e0 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70  nSpace);.  if( p
238f0 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
23900 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
23910 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  KPT;.  aTo = (Wh
23920 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
23930 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
23940 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
23950 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
23960 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
23970 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
23980 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
23990 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
239a0 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
239b0 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
239c0 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
239d0 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
239e0 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
239f0 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42   }.  if( nOrderB
23a00 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  y ){.    /* If t
23a10 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
23a20 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69   BY clause and i
23a30 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69  t is not being i
23a40 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20  gnored, set up. 
23a50 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20     ** space for 
23a60 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  the aSortCost[] 
23a70 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d  array. Each elem
23a80 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74  ent of the aSort
23a90 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a  Cost array.    *
23aa0 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  * is either zero
23ab0 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61   - meaning it ha
23ac0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  s not yet been i
23ad0 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20  nitialized - or 
23ae0 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  the.    ** cost 
23af0 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45  of sorting nRowE
23b00 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20  st rows of data 
23b10 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
23b20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a  X terms of.    *
23b30 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
23b40 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64  lause are alread
23b50 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72  y in order, wher
23b60 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79  e X is the array
23b70 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20   .    ** index. 
23b80 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73   */.    aSortCos
23b90 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b  t = (LogEst*)pX;
23ba0 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72  .    memset(aSor
23bb0 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  tCost, 0, sizeof
23bc0 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
23bd0 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rBy);.  }.  asse
23be0 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30  rt( aSortCost==0
23bf0 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
23c00 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f  ce]==(char*)&aSo
23c10 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d  rtCost[nOrderBy]
23c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53   );.  assert( aS
23c30 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70  ortCost!=0 || &p
23c40 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
23c50 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f  char*)pX );..  /
23c60 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
23c70 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
23c80 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
23c90 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
23ca0 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
23cb0 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
23cc0 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
23cd0 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
23ce0 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65  bove 28.  If the
23cf0 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
23d00 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
23d10 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
23d20 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
23d30 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a  in the first 28.
23d40 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
23d50 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
23d60 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
23d70 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
23d80 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
23d90 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29  >nQueryLoop, 48)
23da0 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73  ;  assert( 48==s
23db0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29  qlite3LogEst(28)
23dc0 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b   );.  nFrom = 1;
23dd0 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d  .  assert( aFrom
23de0 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30  [0].isOrdered==0
23df0 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
23e00 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
23e10 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74  nLoop is zero, t
23e20 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
23e30 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74   FROM terms in t
23e40 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a  he query. Since.
23e50 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
23e60 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61  ase the query ma
23e70 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d  y return a maxim
23e80 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74  um of one row, t
23e90 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a  he results.    *
23ea0 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  * are already in
23eb0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f   the requested o
23ec0 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65  rder. Set isOrde
23ed0 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20  red to nOrderBy 
23ee0 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61  to.    ** indica
23ef0 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20  te this. Or, if 
23f00 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72  nLoop is greater
23f10 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20   than zero, set 
23f20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20  isOrdered to.   
23f30 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69   ** -1, indicati
23f40 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ng that the resu
23f50 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61  lt set may or ma
23f60 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64  y not be ordered
23f70 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64  , .    ** depend
23f80 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73  ing on the loops
23f90 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75   added to the cu
23fa0 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a  rrent plan.  */.
23fb0 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
23fc0 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30  rdered = nLoop>0
23fd0 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79   ? -1 : nOrderBy
23fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
23ff0 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
24000 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
24010 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
24020 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
24030 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
24040 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
24050 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
24060 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
24070 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
24080 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
24090 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
240a0 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
240b0 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
240c0 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
240d0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
240e0 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
240f0 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
24100 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
24110 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
24120 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
24130 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
24140 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
24150 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74       LogEst nOut
24160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24170 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76         /* Rows v
24180 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d  isited by (pFrom
24190 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
241a0 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
241b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241c0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
241d0 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c   path (pFrom+pWL
241e0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
241f0 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64  LogEst rUnsorted
24200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24210 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f    /* Unsorted co
24220 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c  st of (pFrom+pWL
24230 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
24240 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  i8 isOrdered = p
24250 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
24260 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66    /* isOrdered f
24270 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  or (pFrom+pWLoop
24280 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
24290 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20  mask maskNew;   
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
242b0 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69  * Mask of src vi
242c0 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f  sited by (..) */
242d0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
242e0 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20   revMask = 0;   
242f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
24300 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20  sk of rev-order 
24310 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a  loops for (..) *
24320 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  /..        if( (
24330 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
24340 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
24350 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
24360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
24370 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
24380 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
24390 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
243a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
243b0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
243c0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
243d0 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e  X)!=0 && pFrom->
243e0 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20 20 20 20  nRow<10 ){.     
243f0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75       /* Do not u
24400 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  se an automatic 
24410 69 6e 64 65 78 20 69 66 20 74 68 65 20 74 68 69  index if the thi
24420 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74  s loop is expect
24430 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
24440 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e  to run less than
24450 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a 20 20 20   2 times. */.   
24460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
24470 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
24480 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  (2) );.         
24490 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
244a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
244b0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
244c0 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
244d0 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
244e0 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
244f0 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
24500 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
24510 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
24520 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
24530 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57  WLoop->rSetup,pW
24540 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72  Loop->rRun + pFr
24550 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  om->nRow);.     
24560 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
24570 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
24580 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d  rUnsorted, pFrom
24590 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20  ->rUnsorted);.  
245a0 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72        nOut = pFr
245b0 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
245c0 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
245d0 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
245e0 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
245f0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
24600 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
24610 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ered<0 ){.      
24620 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
24630 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
24640 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
24650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24660 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
24670 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
24680 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  , pWInfo->wctrlF
24690 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
246a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f               iLo
246b0 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76  op, pWLoop, &rev
246c0 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Mask);.        }
246d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
246e0 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
246f0 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
24700 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
24710 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20  isOrdered>=0 && 
24720 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72  isOrdered<nOrder
24730 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
24740 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  if( aSortCost[is
24750 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20  Ordered]==0 ){. 
24760 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
24770 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20  Cost[isOrdered] 
24780 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  = whereSortingCo
24790 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
247a0 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77      pWInfo, nRow
247b0 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69  Est, nOrderBy, i
247c0 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
247d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
247e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43    }.          rC
247f0 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
24800 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
24810 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  , aSortCost[isOr
24820 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20  dered]);..      
24830 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
24840 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
24850 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
24860 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
24870 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
24880 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
24890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
248a0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
248b0 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
248c0 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
248d0 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
248e0 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
248f0 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
24900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24910 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
24920 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rted;.        }.
24930 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
24940 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
24950 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
24960 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
24970 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
24980 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
24990 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
249a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
249b0 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
249c0 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
249d0 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
249e0 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
249f0 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
24a00 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
24a10 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
24a20 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
24a30 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
24a40 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
24a50 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
24a60 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
24a70 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
24a80 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
24a90 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
24aa0 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
24ab0 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
24ac0 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
24ad0 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
24ae0 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
24af0 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
24b00 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
24b10 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
24b20 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
24b30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24b40 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
24b50 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
24b60 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
24b70 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
24b80 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
24b90 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
24ba0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
24bb0 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
24bc0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
24bd0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
24be0 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
24bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
24c00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
24c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24c20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
24c30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
24c40 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
24c50 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
24c60 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
24c70 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
24c80 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
24c90 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
24ca0 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
24cb0 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
24cc0 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
24cd0 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
24ce0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
24cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24d00 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
24d10 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
24d20 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
24d30 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
24d40 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
24d50 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
24d60 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
24d70 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
24d80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
24d90 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
24da0 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
24db0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
24dc0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
24dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
24de0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
24df0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
24e00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24e10 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
24e20 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
24e30 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
24e40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
24e50 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
24e60 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
24e70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
24e80 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
24e90 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
24ea0 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
24eb0 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
24ec0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
24ed0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
24ee0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24f00 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
24f10 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65  his points it me
24f20 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77  ans that the new
24f30 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a   candidate path.
24f40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
24f50 64 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ds to be added t
24f60 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
24f70 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20  t-so-far paths. 
24f80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
24f90 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
24fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
24fb0 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
24fc0 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
24fd0 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
24fe0 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
24ff0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
25000 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
25010 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
25020 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
25030 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
25040 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
25050 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
25060 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20   jj = mxI;.     
25070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25080 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
25090 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
250a0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
250b0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
250c0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
250d0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
250e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
250f0 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20  ebugPrintf("New 
25100 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
25110 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
25120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25130 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
25140 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
25150 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
25160 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
25170 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
25180 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
25190 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
251a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
251b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
251c0 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
251d0 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62  eaches here if b
251e0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20  est-so-far path 
251f0 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65  pTo=aTo[jj] cove
25200 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rs the.         
25210 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20   ** same set of 
25220 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
25230 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20  e sam isOrdered 
25240 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20  setting as the. 
25250 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64           ** cand
25260 69 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65  idate path.  Che
25270 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
25280 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
25290 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  d replace.      
252a0 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66      ** pTo or if
252b0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
252c0 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64  hould be skipped
252d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
252e0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f  ( pTo->rCost<rCo
252f0 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73  st || (pTo->rCos
25300 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t==rCost && pTo-
25310 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a  >nRow<=nOut) ){.
25320 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
25330 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
25340 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25350 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25360 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
25370 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25380 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74   "Skip   %s cost
253b0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
253c0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
253d0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
253e0 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
253f0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
25400 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
25410 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
25420 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
25430 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
25450 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25460 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
25470 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63  %-3d,%d order=%c
25480 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
25490 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
254a0 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
254b0 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
254c0 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254e0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d  pTo->isOrdered>=
254f0 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  0 ? pTo->isOrder
25500 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
25510 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
25520 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
25530 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  /* Discard the c
25540 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72  andidate path fr
25550 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69  om further consi
25560 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  deration */.    
25570 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25580 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
25590 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ost );.         
255a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
255b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
255c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
255d0 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31  ->rCost==rCost+1
255e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
255f0 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
25600 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e   here if the can
25610 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62  didate path is b
25620 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  etter than the. 
25630 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20           ** pTo 
25640 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70  path.  Replace p
25650 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64  To with the cand
25660 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66  idate. */.#ifdef
25670 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25680 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
25690 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
256a0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
256b0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
256c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
256d0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
256e0 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
256f0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
25700 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
25710 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
25720 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
25730 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
25740 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
25750 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
25760 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
25770 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
25780 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25790 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
257a0 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
257b0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
257c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
257d0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
257e0 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
257f0 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
25800 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
25810 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
25820 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
25830 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
25840 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
25850 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
25870 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
25880 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
25890 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
258a0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
258b0 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
258c0 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
258d0 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
258e0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
258f0 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
25900 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
25910 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
25920 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
25930 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
25940 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
25950 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ted = rUnsorted;
25960 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
25970 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
25980 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
25990 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
259a0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
259b0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
259c0 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
259d0 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
259e0 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
259f0 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
25a00 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
25a10 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
25a20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
25a30 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
25a40 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
25a50 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77  ed = aTo[0].nRow
25a60 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
25a70 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
25a80 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
25a90 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
25aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
25ab0 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
25ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
25ad0 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
25ae0 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  Cost && pTo->rUn
25af0 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65  sorted>mxUnsorte
25b00 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
25b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25b20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
25b30 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
25b40 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
25b50 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b   pTo->rUnsorted;
25b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
25b70 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20  xI = jj;.       
25b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25b90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
25ba0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
25bb0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
25bc0 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f  ABLED  /* >=2 */
25bd0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
25be0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30  WhereTrace & 0x0
25bf0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
25c00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
25c10 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
25c20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
25c30 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
25c40 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
25c50 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
25c60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25c70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25c80 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
25c90 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
25ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
25cb0 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
25cc0 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
25cd0 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
25ce0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
25cf0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
25d00 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
25d10 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a  ed+'0') : '?');.
25d20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
25d30 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a  >isOrdered>0 ){.
25d40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25d50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
25d60 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
25d70 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
25d80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25da0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
25db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25dc0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
25dd0 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
25de0 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
25df0 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
25e00 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
25e10 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
25e20 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
25e30 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
25e40 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
25e50 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
25e60 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
25e70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
25e80 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
25e90 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
25ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
25eb0 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29  eeNN(db, pSpace)
25ec0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25ed0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
25ee0 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
25ef0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
25f00 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
25f10 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
25f20 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
25f30 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
25f40 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
25f50 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
25f60 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
25f70 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
25f80 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
25f90 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
25fa0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
25fb0 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
25fc0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
25fd0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
25fe0 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
25ff0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
26000 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
26010 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
26020 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
26030 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
26040 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
26050 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
26060 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
26070 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
26080 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
26090 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
260a0 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
260b0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
260c0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
260d0 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
260e0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
260f0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
26100 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
26110 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
26120 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26130 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
26140 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
26150 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
26160 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
26170 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
26180 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
26190 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
261a0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
261b0 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
261c0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
261d0 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
261f0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
26200 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
26210 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
26220 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
26230 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
26240 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
26250 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
26260 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
26270 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
26280 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
26290 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
262a0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
262b0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
262c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
262d0 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
262e0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
262f0 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
26300 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
26310 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
26320 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
26330 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
26340 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
26350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26360 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
26370 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
26380 64 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  d;.      pWInfo-
26390 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d  >revMask = pFrom
263a0 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
263b0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
263c0 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sat<=0 ){.      
263d0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
263e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
263f0 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20  ( nLoop>0 ){.   
26400 20 20 20 20 20 20 20 75 33 32 20 77 73 46 6c 61         u32 wsFla
26410 67 73 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  gs = pFrom->aLoo
26420 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c  p[nLoop-1]->wsFl
26430 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
26440 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  f( (wsFlags & WH
26450 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a  ERE_ONEROW)==0 .
26460 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77             && (w
26470 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 49 50  sFlags&(WHERE_IP
26480 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  K|WHERE_COLUMN_I
26490 4e 29 29 21 3d 28 57 48 45 52 45 5f 49 50 4b 7c  N))!=(WHERE_IPK|
264a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
264b0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
264c0 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
264d0 6b 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k m = 0;.       
264e0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68       int rc = wh
264f0 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
26500 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
26510 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
26520 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
26540 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
26550 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  IT, nLoop-1, pFr
26560 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
26570 31 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20 20  1], &m);.       
26580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
26590 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
265a0 50 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  PK );.          
265b0 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
265c0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
265d0 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20  MN_IN );.       
265e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49       if( rc==pWI
265f0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
26600 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
26610 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f        pWInfo->bO
26620 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
26630 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
26640 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
26650 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20  sk = m;.        
26660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26670 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26680 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
26690 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
266a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
266b0 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20  RTBYGROUP).     
266c0 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
266d0 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  BSat==pWInfo->pO
266e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26  rderBy->nExpr &&
266f0 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a   nLoop>0.    ){.
26700 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
26710 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  vMask = 0;.     
26720 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68   int nOrder = wh
26730 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
26740 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
26750 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
26760 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
26770 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  om, 0, nLoop-1, 
26780 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
26790 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a  op-1], &revMask.
267a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
267b0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73  ssert( pWInfo->s
267c0 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  orted==0 );.    
267d0 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57    if( nOrder==pW
267e0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
267f0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
26800 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20   pWInfo->sorted 
26810 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49  = 1;.        pWI
26820 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72  nfo->revMask = r
26830 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  evMask;.      }.
26840 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57      }.  }...  pW
26850 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
26860 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
26870 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
26880 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
26890 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
268a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
268b0 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
268c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
268d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20  ;.}../*.** Most 
268e0 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79  queries use only
268f0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
26900 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f  (they are not jo
26910 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a  ins) and have.**
26920 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74   simple == const
26930 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69  raints against i
26940 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20  ndexed fields.  
26950 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
26960 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e  empts.** to plan
26970 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61   those simple ca
26980 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c  ses using much l
26990 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61  ess ceremony tha
269a0 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c  n the.** general
269b0 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
269c0 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72  lanner, and ther
269d0 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72  eby yield faster
269e0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
269f0 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20  ().** times for 
26a00 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
26a10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  .**.** Return no
26a20 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n-zero on succes
26a30 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79  s, if this query
26a40 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20   can be handled 
26a50 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72  by this.** no-fr
26a60 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e  ills query plann
26a70 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  er.  Return zero
26a80 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e   if this query n
26a90 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e  eeds the .** gen
26aa0 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
26ab0 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73  ry planner..*/.s
26ac0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53  tatic int whereS
26ad0 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f  hortCut(WhereLoo
26ae0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
26af0 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
26b00 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75   *pWInfo;.  stru
26b10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
26b20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43  *pItem;.  WhereC
26b30 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
26b40 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
26b50 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
26b60 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  op;.  int iCur;.
26b70 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65    int j;.  Table
26b80 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
26b90 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f  *pIdx;..  pWInfo
26ba0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
26bb0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  nfo;.  if( pWInf
26bc0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
26bd0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
26be0 53 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  SE ) return 0;. 
26bf0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
26c00 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
26c10 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
26c20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
26c30 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
26c40 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
26c50 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
26c60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
26c70 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
26c80 6e 64 65 78 65 64 42 79 20 29 20 72 65 74 75 72  ndexedBy ) retur
26c90 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  n 0;.  iCur = pI
26ca0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
26cb0 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
26cc0 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42  WC;.  pLoop = pB
26cd0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
26ce0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
26cf0 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b   0;.  pLoop->nSk
26d00 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20  ip = 0;.  pTerm 
26d10 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
26d20 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
26d30 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57  , -1, 0, WO_EQ|W
26d40 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_IS, 0);.  if( 
26d50 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73  pTerm ){.    tes
26d60 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
26d70 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
26d80 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
26d90 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
26da0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50  LUMN_EQ|WHERE_IP
26db0 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  K|WHERE_ONEROW;.
26dc0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
26dd0 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
26de0 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
26df0 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  = 1;.    pLoop->
26e00 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
26e10 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
26e20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20  Cost of a rowid 
26e30 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a  lookup is 10 */.
26e40 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
26e50 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71  = 33;  /* 33==sq
26e60 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
26e70 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
26e80 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
26e90 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
26ea0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
26eb0 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b        int opMask
26ec0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26ed0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
26ee0 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
26ef0 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  m );.      if( !
26f00 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
26f10 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  dx).       || pI
26f20 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
26f30 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e!=0 .       || 
26f40 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72  pIdx->nKeyCol>Ar
26f50 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61  raySize(pLoop->a
26f60 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20  LTermSpace) .   
26f70 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20     ) continue;. 
26f80 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49       opMask = pI
26f90 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
26fa0 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  ? (WO_EQ|WO_IS) 
26fb0 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66  : WO_EQ;.      f
26fc0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
26fd0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
26fe0 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73         pTerm = s
26ff0 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
27000 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
27010 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64  , 0, opMask, pId
27020 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
27030 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
27040 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
27050 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
27060 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
27070 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
27080 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d  LTerm[j] = pTerm
27090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
270a0 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65  if( j!=pIdx->nKe
270b0 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  yCol ) continue;
270c0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  .      pLoop->ws
270d0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
270e0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e  LUMN_EQ|WHERE_ON
270f0 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58  EROW|WHERE_INDEX
27100 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ED;.      if( pI
27110 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c  dx->isCovering |
27120 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  | (pItem->colUse
27130 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
27140 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b  dex(pIdx))==0 ){
27150 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
27160 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27170 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
27180 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
27190 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20  nLTerm = j;.    
271a0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
271b0 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .nEq = j;.      
271c0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
271d0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
271e0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
271f0 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20  ost of a unique 
27200 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20  index lookup is 
27210 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f  15 */.      pLoo
27220 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f  p->rRun = 39;  /
27230 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 39==sqlite3Log
27240 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  Est(15) */.     
27250 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27260 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
27270 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
27280 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
27290 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66  Est)1;.    pWInf
272a0 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d  o->a[0].pWLoop =
272b0 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73 65   pLoop;.    asse
272c0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  rt( pWInfo->sMas
272d0 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43 75  kSet.n==1 && iCu
272e0 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  r==pWInfo->sMask
272f0 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20 20  Set.ix[0] );.   
27300 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
27310 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65 33   = 1; /* sqlite3
27320 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
27330 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
27340 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70 57  iCur); */.    pW
27350 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
27360 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
27370 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
27380 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
27390 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
273a0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
273b0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
273c0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
273d0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
273e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
273f0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
27400 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
27410 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
27420 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
27430 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
27440 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
27450 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
27460 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
27470 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
27480 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
27490 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
274a0 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
274b0 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
274c0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
274d0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
274e0 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
274f0 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
27500 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
27510 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
27520 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
27530 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
27540 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
27550 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
27560 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
27570 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
27580 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
27590 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
275a0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
275b0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
275c0 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
275d0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
275e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
275f0 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
27600 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
27610 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
27620 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
27630 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
27640 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
27650 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
27660 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
27670 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
27680 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
27690 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
276a0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
276b0 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
276c0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
276d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
276e0 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
276f0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
27700 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
27710 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
27720 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
27730 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
27740 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
27750 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
27760 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
27770 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
27780 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
27790 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
277a0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
277b0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
277c0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
277d0 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
277e0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
277f0 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
27800 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
27810 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
27820 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
27830 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27850 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
27860 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
27870 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
27890 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
278a0 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
278b0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
278c0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
278d0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
278e0 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
278f0 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
27900 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
27910 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
27920 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27930 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
27940 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
27950 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
27960 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
27970 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
27980 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
27990 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
279a0 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
279b0 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
279c0 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
279d0 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
279e0 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
279f0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
27a00 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
27a10 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
27a20 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
27a30 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
27a40 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
27a50 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
27a60 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
27a70 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
27a80 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
27a90 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
27aa0 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
27ab0 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
27ac0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
27ad0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
27ae0 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
27af0 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
27b00 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
27b10 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
27b20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
27b30 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
27b40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
27b50 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
27b60 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
27b70 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
27b80 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
27b90 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
27ba0 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
27bb0 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
27bc0 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
27bd0 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
27be0 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
27bf0 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
27c00 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
27c10 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
27c20 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
27c30 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
27c40 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
27c50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
27c60 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
27c70 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
27c80 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
27c90 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
27ca0 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
27cb0 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
27cc0 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
27cd0 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
27ce0 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
27cf0 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
27d00 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
27d10 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
27d20 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
27d30 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
27d40 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
27d50 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
27d60 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
27d70 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
27d80 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
27d90 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
27da0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
27db0 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
27dc0 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
27dd0 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
27de0 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
27df0 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
27e00 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
27e10 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
27e20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
27e30 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
27e40 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
27e50 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
27e60 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
27e70 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
27e80 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
27e90 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
27ea0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
27eb0 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
27ec0 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
27ed0 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
27ee0 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
27ef0 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
27f00 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
27f10 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
27f20 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
27f30 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
27f40 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
27f50 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
27f60 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
27f70 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
27f80 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
27f90 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
27fa0 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
27fb0 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
27fc0 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
27fd0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
27fe0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
27ff0 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
28000 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
28010 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
28020 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
28030 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
28040 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
28050 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
28060 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
28070 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
28080 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
28090 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
280a0 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
280b0 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
280c0 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
280d0 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
280e0 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
280f0 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
28100 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
28110 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
28120 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
28130 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
28140 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
28150 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
28160 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
28170 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
28180 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
28190 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
281a0 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
281b0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
281c0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
281d0 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
281e0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
281f0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
28200 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
28210 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
28220 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65 74   iIdxCur paramet
28230 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  er is the cursor
28240 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e   number of an in
28250 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45  dex.  If .** WHE
28260 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
28270 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72 20  is set, iIdxCur 
28280 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
28290 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
282a0 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20 4f  .** to use for O
282b0 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
282c0 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45 20  ing.  The WHERE 
282d0 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75 73  clause should us
282e0 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69 66  e this.** specif
282f0 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20 57  ic cursor.  If W
28300 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
28310 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68 65  IRED is set, the
28320 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a 20  n iIdxCur is.** 
28330 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  the first cursor
28340 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
28350 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20  cursors for all 
28360 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43 75  indices.  iIdxCu
28370 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75  r should.** be u
28380 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
28390 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
283a0 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67 20  ursor depending 
283b0 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 69  on which index i
283c0 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68  s.** used..*/.Wh
283d0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
283e0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
283f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
28400 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
28410 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
28420 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
28430 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  st,      /* FROM
28440 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20   clause: A list 
28450 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
28460 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
28470 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
28480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28490 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
284a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
284b0 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20  erBy,     /* An 
284c0 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
284d0 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20 6f  UP BY) clause, o
284e0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
284f0 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74  List *pResultSet
28500 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 72 65 73  ,   /* Query res
28510 75 6c 74 20 73 65 74 2e 20 20 52 65 71 27 64 20  ult set.  Req'd 
28520 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  for DISTINCT */.
28530 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
28540 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
28550 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
28560 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
28570 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
28580 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20  AuxArg          
28590 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f     /* If WHERE_O
285a0 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73  R_SUBCLAUSE is s
285b0 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
285c0 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20   number.        
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53    ** If WHERE_US
285f0 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68  E_LIMIT, then th
28600 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a  e limit amount *
28610 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
28620 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
28630 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20    /* Num. bytes 
28640 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68  allocated for Wh
28650 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a  ereInfo struct *
28660 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74  /.  int nTabList
28670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28680 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
28690 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74  ents in pTabList
286a0 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
286b0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
286c0 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
286d0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
286e0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
286f0 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
28700 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
28710 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
28720 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
28730 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
28740 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
28750 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74   /* Cursors that
28760 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73   are not yet pos
28770 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65  itioned */.  Whe
28780 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57  reLoopBuilder sW
28790 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57  LB;     /* The W
287a0 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72  hereLoop builder
287b0 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
287c0 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
287d0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
287e0 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
287f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
28800 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  vel;        /* A
28810 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
28820 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a   pWInfo->a[] */.
28830 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
28840 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
28850 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e  Pointer to a sin
28860 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  gle WhereLoop ob
28870 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69  ject */.  int ii
28880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28890 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
288a0 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
288b0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
288c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
288d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
288e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
288f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28900 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
28910 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20  u8 bFordelete = 
28920 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50  0;         /* OP
28930 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f  FLAG_FORDELETE o
28940 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f  r zero, as appro
28950 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73  priate */..  ass
28960 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
28970 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
28980 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c  _MULTIROW)==0 ||
28990 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72   (.        (wctr
289a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
289b0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
289c0 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74  =0 .     && (wct
289d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
289e0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
289f0 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e   .  ));..  /* On
28a00 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f  ly one of WHERE_
28a10 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20  OR_SUBCLAUSE or 
28a20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
28a30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
28a40 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28a50 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
28a60 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
28a70 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
28a80 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d  HERE_USE_LIMIT)=
28a90 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  =0 );..  /* Vari
28aa0 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
28ab0 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ion */.  db = pP
28ac0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
28ad0 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
28ae0 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f  eof(sWLB));..  /
28af0 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50  * An ORDER/GROUP
28b00 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f   BY clause of mo
28b10 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73  re than 63 terms
28b20 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
28b30 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61  ized */.  testca
28b40 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  se( pOrderBy && 
28b50 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
28b60 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
28b70 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64  pOrderBy && pOrd
28b80 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  erBy->nExpr>=BMS
28b90 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
28ba0 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  .  sWLB.pOrderBy
28bb0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
28bc0 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
28bd0 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
28be0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
28bf0 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
28c00 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
28c10 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
28c20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
28c30 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
28c40 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
28c50 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
28c60 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  , SQLITE_Distinc
28c70 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74  tOpt) ){.    wct
28c80 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  rlFlags &= ~WHER
28c90 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b  E_WANT_DISTINCT;
28ca0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  .  }..  /* The n
28cb0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
28cc0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
28cd0 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
28ce0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
28cf0 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
28d00 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
28d10 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
28d20 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
28d30 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
28d40 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
28d50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28d60 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
28d70 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
28d80 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
28d90 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
28da0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
28db0 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
28dc0 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
28dd0 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
28de0 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
28df0 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
28e00 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
28e10 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  USE flag is set,
28e20 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
28e30 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
28e40 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
28e50 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
28e60 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
28e70 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
28e80 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
28e90 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
28ea0 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
28eb0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
28ec0 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
28ed0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28ee0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
28ef0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
28f00 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
28f10 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
28f20 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
28f30 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
28f40 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
28f50 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
28f60 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
28f70 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
28f80 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
28f90 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
28fa0 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
28fb0 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
28fc0 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
28fd0 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
28fe0 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
28ff0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
29000 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
29010 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
29020 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
29030 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
29040 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
29050 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
29060 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
29070 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
29080 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
29090 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
290a0 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49  ..  */.  nByteWI
290b0 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
290c0 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
290d0 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
290e0 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
290f0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
29100 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
29110 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
29120 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
29130 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
29140 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
29150 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
29160 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
29170 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
29180 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
29190 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
291a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
291b0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
291c0 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
291d0 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
291e0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
291f0 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  erBy;.  pWInfo->
29200 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
29210 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  .  pWInfo->pResu
29220 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53  ltSet = pResultS
29230 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69  et;.  pWInfo->ai
29240 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20  CurOnePass[0] = 
29250 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
29260 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Pass[1] = -1;.  
29270 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
29280 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   nTabList;.  pWI
29290 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57  nfo->iBreak = pW
292a0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
292b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
292c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
292d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
292e0 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
292f0 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d  pWInfo->iLimit =
29300 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e   iAuxArg;.  pWIn
29310 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
29320 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
29330 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d 73  ueryLoop;.  mems
29340 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  et(&pWInfo->nOBS
29350 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  at, 0, .        
29360 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65 49   offsetof(WhereI
29370 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66 73 65  nfo,sWC) - offse
29380 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 6e 4f  tof(WhereInfo,nO
29390 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  BSat));.  memset
293a0 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  (&pWInfo->a[0], 
293b0 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  0, sizeof(WhereL
293c0 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a 73 69  oop)+nTabList*si
293d0 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
293e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
293f0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
29400 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f  NEPASS_OFF );  /
29410 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c  * ONEPASS defaul
29420 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70  ts to OFF */.  p
29430 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
29440 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
29450 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
29460 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
29470 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
29480 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
29490 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
294a0 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
294b0 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
294c0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
294d0 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
294e0 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
294f0 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
29500 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29510 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
29520 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
29530 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
29540 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
29550 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
29560 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
29570 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
29580 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
29590 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
295a0 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
295b0 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
295c0 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
295d0 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49  ite3WhereClauseI
295e0 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
295f0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
29600 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26  ite3WhereSplit(&
29610 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
29620 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  ere, TK_AND);.  
29630 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
29640 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
29650 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
29660 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
29670 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
29680 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
29690 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
296a0 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
296b0 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66  l thru..  */.  f
296c0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42  or(ii=0; ii<sWLB
296d0 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  .pWC->nTerm; ii+
296e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62  +){.    if( nTab
296f0 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
29700 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
29710 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43  NotJoin(sWLB.pWC
29720 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
29730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
29740 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
29750 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  e, sWLB.pWC->a[i
29760 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f  i].pExpr, pWInfo
29770 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20  ->iBreak,.      
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29790 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
297a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c  NULL);.      sWL
297b0 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46  B.pWC->a[ii].wtF
297c0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
297d0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
297e0 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
297f0 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
29800 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
29810 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
29820 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
29830 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
29840 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
29850 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
29860 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
29870 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
29880 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
29890 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
298a0 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
298b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
298c0 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
298d0 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
298e0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
298f0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
29900 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20  *.  ** The N-th 
29910 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
29920 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69 67   clause is assig
29930 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66  ned a bitmask of
29940 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   1<<N..  **.  **
29950 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65   The rule of the
29960 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
29970 63 65 20 65 6e 73 75 72 65 73 20 74 68 74 61 20  ce ensures thta 
29980 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
29990 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74  ask for.  ** a t
299a0 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31  able T, then X-1
299b0 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
299c0 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  for all other ta
299d0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
299e0 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77   of T..  ** Know
299f0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
29a00 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
29a10 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
29a20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a  left join is.  *
29a30 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  * important.  Ti
29a40 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
29a50 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
29a60 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
29a70 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
29a80 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
29a90 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
29aa0 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
29ab0 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
29ac0 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
29ad0 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
29ae0 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
29af0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
29b00 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
29b10 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
29b20 20 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   ** WHERE_OR_SUB
29b30 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73  CLAUSE flag is s
29b40 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
29b50 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
29b60 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
29b70 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
29b80 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
29b90 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
29ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  ;.    sqlite3Whe
29bb0 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50  reTabFuncArgs(pP
29bc0 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d  arse, &pTabList-
29bd0 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d  >a[ii], &pWInfo-
29be0 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65  >sWC);.  }.#ifde
29bf0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29c00 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
29c10 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
29c20 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ++){.    Bitmask
29c30 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72   m = sqlite3Wher
29c40 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eGetMask(pMaskSe
29c50 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
29c60 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
29c70 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b   assert( m==MASK
29c80 42 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23  BIT(ii) );.  }.#
29c90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
29ca0 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
29cb0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a  ubexpressions. *
29cc0 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  /.  sqlite3Where
29cd0 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  ExprAnalyze(pTab
29ce0 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
29cf0 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
29d00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
29d10 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
29d20 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c  or;..  if( wctrl
29d30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
29d40 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
29d50 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
29d60 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
29d70 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
29d80 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75  Info->sWC, pResu
29d90 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ltSet) ){.      
29da0 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
29db0 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
29dc0 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
29dd0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
29de0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
29df0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
29e00 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
29e10 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
29e20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
29e30 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
29e40 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
29e50 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
29e60 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
29e70 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
29e80 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
29e90 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
29ea0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
29eb0 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
29ec0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
29ed0 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
29ee0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
29ef0 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cts */.#if defin
29f00 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ed(WHERETRACE_EN
29f10 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c  ABLED).  if( sql
29f20 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
29f30 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73   0xffff ){.    s
29f40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29f50 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  f("*** Optimizer
29f60 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72   Start *** (wctr
29f70 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63  lFlags: 0x%x",wc
29f80 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  trlFlags);.    i
29f90 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
29fa0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20  WHERE_USE_LIMIT 
29fb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29fc0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c  DebugPrintf(", l
29fd0 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41  imit: %d", iAuxA
29fe0 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rg);.    }.    s
29ff0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2a000 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  f(")\n");.  }.  
2a010 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2a020 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2a030 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2a040 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2a050 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  RE clause */.   
2a060 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
2a070 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57  usePrint(sWLB.pW
2a080 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
2a090 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d    if( nTabList!=
2a0a0 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43  1 || whereShortC
2a0b0 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a  ut(&sWLB)==0 ){.
2a0c0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2a0d0 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b  opAddAll(&sWLB);
2a0e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2a0f0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2a100 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48  or;.  .#ifdef WH
2a110 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2a120 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a130 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20  WhereTrace ){   
2a140 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20   /* Display all 
2a150 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2a160 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20   objects */.    
2a170 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
2a180 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2a190 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2a1a0 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20  char zLabel[] = 
2a1b0 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
2a1c0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
2a1d0 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20  vwyxz".         
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a200 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2a210 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
2a220 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
2a230 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d  Info->pLoops, i=
2a240 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  0; p; p=p->pNext
2a250 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Loop, i++){.    
2a260 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61      p->cId = zLa
2a270 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61  bel[i%sizeof(zLa
2a280 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77  bel)];.        w
2a290 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
2a2a0 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20   sWLB.pWC);.    
2a2b0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
2a2c0 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74  .  .    wherePat
2a2d0 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2a2e0 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
2a2f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2a300 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2a310 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ror;.    if( pWI
2a320 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
2a330 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74  .       wherePat
2a340 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20  hSolver(pWInfo, 
2a350 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b  pWInfo->nRowOut+
2a360 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64  1);.       if( d
2a370 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a380 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2a390 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  nError;.    }.  
2a3a0 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
2a3b0 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28  pOrderBy==0 && (
2a3c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2a3d0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29  TE_ReverseOrder)
2a3e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e  !=0 ){.     pWIn
2a3f0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c  fo->revMask = AL
2a400 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28  LBITS;.  }.  if(
2a410 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2a420 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
2a430 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20  cFailed) ){.    
2a440 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2a450 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66  rror;.  }.#ifdef
2a460 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
2a470 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2a480 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20  3WhereTrace ){. 
2a490 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2a4a0 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75  rintf("---- Solu
2a4b0 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70  tion nRow=%d", p
2a4c0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
2a4d0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
2a4e0 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20  >nOBSat>0 ){.   
2a4f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2a500 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d  rintf(" ORDERBY=
2a510 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e  %d,0x%llx", pWIn
2a520 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e  fo->nOBSat, pWIn
2a530 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20  fo->revMask);.  
2a540 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
2a550 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2a560 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
2a570 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2a580 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
2a590 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2a5a0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2a5b0 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20  unique");.      
2a5c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a5d0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
2a5e0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
2a5f0 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2a600 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a610 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64  ("  DISTINCT=ord
2a620 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
2a630 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2a640 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
2a650 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2a660 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
2a670 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a680 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f  ("  DISTINCT=uno
2a690 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
2a6a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a6b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a6c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
2a6d0 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  n");.    for(ii=
2a6e0 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  0; ii<pWInfo->nL
2a6f0 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  evel; ii++){.   
2a700 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
2a710 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e  t(pWInfo->a[ii].
2a720 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43  pWLoop, sWLB.pWC
2a730 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
2a740 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  dif.  /* Attempt
2a750 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20   to omit tables 
2a760 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68  from the join th
2a770 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74  at do not effect
2a780 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
2a790 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
2a7a0 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65  vel>=2.   && pRe
2a7b0 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26  sultSet!=0.   &&
2a7c0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2a7d0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2a7e0 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20  OmitNoopJoin).  
2a7f0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74  ){.    Bitmask t
2a800 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33  abUsed = sqlite3
2a810 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
2a820 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65  ge(pMaskSet, pRe
2a830 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66  sultSet);.    if
2a840 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20  ( sWLB.pOrderBy 
2a850 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64  ){.      tabUsed
2a860 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
2a870 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
2a880 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
2a890 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  derBy);.    }.  
2a8a0 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
2a8b0 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20  >nLevel>=2 ){.  
2a8c0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2a8d0 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  Term, *pEnd;.   
2a8e0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
2a8f0 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  o->a[pWInfo->nLe
2a900 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  vel-1].pWLoop;. 
2a910 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
2a920 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
2a930 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f  oop->iTab].fg.jo
2a940 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
2a950 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2a960 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2a970 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
2a980 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
2a990 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
2a9a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2a9b0 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
2a9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
2a9d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2a9e0 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
2a9f0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
2aa00 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
2aa10 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
2aa20 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
2aa30 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
2aa40 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
2aa50 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
2aa60 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2aa70 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2aa80 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
2aa90 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
2aaa0 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
2aab0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
2aac0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
2aad0 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
2aae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
2aaf0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2ab00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ab10 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
2ab20 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
2ab30 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
2ab40 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
2ab50 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
2ab60 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
2ab70 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
2ab80 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
2ab90 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
2aba0 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
2abb0 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
2abc0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
2abd0 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
2abe0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2abf0 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
2ac00 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
2ac10 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2ac20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2ac30 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2ac40 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2ac50 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2ac60 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2ac70 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2ac80 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2ac90 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2aca0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2acb0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2acc0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2acd0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2ace0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2acf0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2ad00 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
2ad10 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
2ad20 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
2ad30 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2ad40 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
2ad50 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
2ad60 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
2ad70 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77  .    if( bOnerow
2ad80 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c  .     || ((wctrl
2ad90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2ada0 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21  EPASS_MULTIROW)!
2adb0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2adc0 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57   0==(wsFlags & W
2add0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2ade0 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  E)).    ){.     
2adf0 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2ae00 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e  s = bOnerow ? ON
2ae10 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f  EPASS_SINGLE : O
2ae20 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20  NEPASS_MULTI;.  
2ae30 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
2ae40 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
2ae50 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67  pTab) && (wsFlag
2ae60 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2ae70 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LY) ){.        i
2ae80 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2ae90 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2aea0 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  LTIROW ){.      
2aeb0 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d      bFordelete =
2aec0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
2aed0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
2aee0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
2aef0 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2af00 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e  s = (wsFlags & ~
2af10 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b  WHERE_IDX_ONLY);
2af20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2af30 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
2af40 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2af50 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
2af60 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
2af70 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
2af80 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
2af90 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
2afa0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2afb0 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
2afc0 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
2afd0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2afe0 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
2aff0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
2b000 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
2b010 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
2b020 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2b030 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
2b040 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2b050 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2b060 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
2b070 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2b080 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2b090 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
2b0a0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2b0b0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2b0c0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2b0d0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2b0e0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
2b0f0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
2b100 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2b110 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2b120 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2b130 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2b140 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2b150 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2b160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2b170 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2b180 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2b190 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2b1a0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
2b1b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b1c0 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
2b1d0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
2b1e0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
2b1f0 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
2b200 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
2b210 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
2b220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2b230 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
2b240 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
2b250 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
2b260 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
2b270 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
2b280 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
2b290 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2b2a0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2b2b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2b2c0 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
2b2d0 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
2b2e0 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2b2f0 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20  CLAUSE)==0 ){.  
2b300 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
2b310 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
2b320 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2b330 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
2b340 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  F ){.        op 
2b350 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
2b360 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2b370 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
2b380 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2b390 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  sor;.      };.  
2b3a0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
2b3b0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
2b3c0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
2b3d0 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
2b3e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2b3f0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d  abItem->iCursor=
2b400 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
2b410 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2b420 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2b430 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2b440 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2b450 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2b460 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2b470 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2b480 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2b490 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2b4a0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2b4b0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2b4c0 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
2b4d0 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f  Col<BMS && HasRo
2b4e0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2b4f0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
2b500 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
2b510 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
2b520 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
2b530 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
2b540 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
2b550 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b560 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45  P4(v, -1, SQLITE
2b570 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
2b580 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
2b590 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
2b5a0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
2b5b0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2b5c0 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
2b5d0 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  HINTS.      if( 
2b5e0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2b5f0 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
2b600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2b610 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
2b620 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c  G_SEEKEQ|bFordel
2b630 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ete);.      }els
2b640 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
2b650 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b660 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2b670 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
2b680 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2b690 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
2b6a0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
2b6b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b6c0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
2b6d0 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74  umnsUsed, pTabIt
2b6e0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20  em->iCursor, 0, 
2b6f0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b710 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49  const u8*)&pTabI
2b720 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34  tem->colUsed, P4
2b730 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
2b740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b750 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
2b760 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
2b770 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
2b780 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2b790 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
2b7a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2b7b0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
2b7c0 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
2b7d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2b7e0 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
2b7f0 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
2b800 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
2b810 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
2b820 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61 79  iAuxArg is alway
2b830 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
2b840 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
2b850 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
2b860 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2b870 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20  ert( iAuxArg!=0 
2b880 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
2b890 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2b8a0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2b8b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b8c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2b8d0 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
2b8e0 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
2b8f0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2b900 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2b910 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29  AUSE)!=0.      )
2b920 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2b930 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66  s is one term of
2b940 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74   an OR-optimizat
2b950 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52  ion using the PR
2b960 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20  IMARY KEY of a. 
2b970 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55         ** WITHOU
2b980 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
2b990 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65  No need for a se
2b9a0 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a  parate index */.
2b9b0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2b9c0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
2b9d0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  Cur;.        op 
2b9e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2b9f0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2ba00 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2ba10 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  FF ){.        In
2ba20 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
2ba30 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
2ba40 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
2ba50 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  Cur = iAuxArg;. 
2ba60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
2ba70 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ba80 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2ba90 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
2baa0 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
2bab0 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
2bac0 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2bad0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
2bae0 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
2baf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bb00 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
2bb10 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
2bb20 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2bb30 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
2bb40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bb50 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74 72  iAuxArg && (wctr
2bb60 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2bb70 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20  R_SUBCLAUSE)!=0 
2bb80 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  ){.        iInde
2bb90 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
2bba0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2bbb0 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20  ReopenIdx;.     
2bbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bbd0 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72  iIndexCur = pPar
2bbe0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2bbf0 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
2bc00 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64  ->iIdxCur = iInd
2bc10 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  exCur;.      ass
2bc20 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
2bc30 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
2bc40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2bc50 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
2bc60 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29  ;.      if( op )
2bc70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2bc80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
2bc90 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
2bca0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
2bcb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2bcc0 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
2bcd0 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
2bce0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
2bcf0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2bd00 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a  _CONSTRAINT)!=0.
2bd10 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f           && (pLo
2bd20 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
2bd30 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2bd40 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  E|WHERE_SKIPSCAN
2bd50 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ))==0.         &
2bd60 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2bd70 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
2bd80 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20  RBY_MIN)==0.    
2bd90 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
2bda0 65 44 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45  eDistinct!=WHERE
2bdb0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2bdc0 44 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  D.        ){.   
2bdd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2bde0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2bdf0 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a  FLAG_SEEKEQ); /*
2be00 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20   Hint to COMDB2 
2be10 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
2be20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2be30 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
2be40 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
2be50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2be60 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
2be70 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2be80 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d     u64 colUsed =
2be90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2bea0 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20  t ii, jj;.      
2beb0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2bec0 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  <pIx->nColumn; i
2bed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2bee0 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f    jj = pIx->aiCo
2bef0 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20  lumn[ii];.      
2bf00 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29        if( jj<0 )
2bf10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2bf20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33         if( jj>63
2bf30 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20   ) jj = 63;.    
2bf40 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
2bf50 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  bItem->colUsed &
2bf60 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30   MASKBIT(jj))==0
2bf70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bf80 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
2bf90 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69   |= ((u64)1)<<(i
2bfa0 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b  i<63 ? ii : 63);
2bfb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bfc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2bfd0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2bfe0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2bff0 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c  iIndexCur, 0, 0,
2c000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c020 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20   (u8*)&colUsed, 
2c030 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  P4_INT64);.     
2c040 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
2c050 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
2c060 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f  UMN_USED_MASK */
2c070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c080 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
2c090 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
2c0a0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
2c0b0 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
2c0c0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
2c0d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2c0e0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
2c0f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2c100 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2c110 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
2c120 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2c130 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
2c140 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2c150 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
2c160 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
2c170 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
2c180 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
2c190 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
2c1a0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
2c1b0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2c1c0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
2c1d0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
2c1e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
2c1f0 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
2c200 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20    int wsFlags;. 
2c210 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2c220 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  nfo->a[ii];.    
2c230 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  wsFlags = pLevel
2c240 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2c250 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
2c260 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2c270 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
2c280 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2c290 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c2a0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
2c2b0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
2c2c0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
2c2d0 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
2c2e0 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
2c2f0 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
2c300 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2c310 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
2c320 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
2c330 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c340 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2c350 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
2c360 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78  endif.    addrEx
2c370 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  plain = sqlite3W
2c380 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
2c390 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  an(.        pPar
2c3a0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
2c3b0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
2c3c0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
2c3d0 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  ags.    );.    p
2c3e0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20  Level->addrBody 
2c3f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2c400 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2c410 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69   notReady = sqli
2c420 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c  te3WhereCodeOneL
2c430 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
2c440 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a   ii, notReady);.
2c450 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
2c460 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
2c470 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66  addrCont;.    if
2c480 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45  ( (wsFlags&WHERE
2c490 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26  _MULTI_OR)==0 &&
2c4a0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
2c4b0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2c4c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2c4d0 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e  ite3WhereAddScan
2c4e0 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69  Status(v, pTabLi
2c4f0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72  st, pLevel, addr
2c500 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a  Explain);.    }.
2c510 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
2c520 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
2c530 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
2c540 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  n WHERE-core"));
2c550 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
2c560 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
2c570 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
2c580 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
2c590 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
2c5a0 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
2c5b0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2c5c0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2c5d0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
2c5e0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2c5f0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
2c600 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2c610 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
2c620 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
2c630 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
2c640 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
2c650 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
2c660 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2c670 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
2c680 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2c690 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2c6a0 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
2c6b0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2c6c0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
2c6d0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2c6e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
2c6f0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2c700 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2c710 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
2c720 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2c730 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2c740 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2c750 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2c760 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2c770 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2c780 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
2c790 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
2c7a0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2c7b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2c7c0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2c7d0 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
2c7e0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
2c7f0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61   i--){.    int a
2c800 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ddr;.    pLevel 
2c810 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
2c820 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2c830 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
2c840 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
2c850 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e  =OP_Noop ){.#ifn
2c860 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2c870 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2c880 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e 74 20  TINCT.      int 
2c890 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20  addrSeek = 0;.  
2c8a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2c8b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2c8c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2c8d0 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
2c8e0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2c8f0 44 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f  D.       && (pLo
2c900 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2c910 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
2c920 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20         && (pIdx 
2c930 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2c940 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61  .pIndex)->hasSta
2c950 74 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20  t1.       && (n 
2c960 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2c970 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20  .nIdxCol)>0.    
2c980 20 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f     && pIdx->aiRo
2c990 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20  wLogEst[n]>=36. 
2c9a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c9b0 69 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d  int r1 = pParse-
2c9c0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
2c9d0 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20   int j, op;.    
2c9e0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
2c9f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2ca00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ca10 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2ca20 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
2ca30 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20  r, j, r1+j);.   
2ca40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2ca50 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
2ca60 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  +1;.        op =
2ca70 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2ca80 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54  Prev ? OP_SeekLT
2ca90 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20   : OP_SeekGT;.  
2caa0 20 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d        addrSeek =
2cab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2cac0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65  p4Int(v, op, pLe
2cad0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c  vel->iIdxCur, 0,
2cae0 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20   r1, n);.       
2caf0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2cb00 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54  v, op==OP_SeekLT
2cb10 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2cb20 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
2cb30 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20  =OP_SeekGT);.   
2cb40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cb50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2cb60 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  o, 1, pLevel->p2
2cb70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2cb80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41  f /* SQLITE_DISA
2cb90 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49  BLE_SKIPAHEAD_DI
2cba0 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20  STINCT */.      
2cbb0 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
2cbc0 73 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  se: Advance to t
2cbd0 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  he next row */. 
2cbe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cbf0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2cc00 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2cc10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2cc20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c  VdbeAddOp3(v, pL
2cc30 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
2cc40 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
2cc50 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20  , pLevel->p3);. 
2cc60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cc70 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
2cc80 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56  el->p5);.      V
2cc90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2cca0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2ccb0 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2ccc0 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20  op==OP_Next);.  
2ccd0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2cce0 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2ccf0 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20  ==OP_Prev);.    
2cd00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2cd10 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  (v, pLevel->op==
2cd20 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64  OP_VNext);.#ifnd
2cd30 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2cd40 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54  E_SKIPAHEAD_DIST
2cd50 49 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61  INCT.      if( a
2cd60 64 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65  ddrSeek ) sqlite
2cd70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2cd80 20 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64   addrSeek);.#end
2cd90 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
2cda0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2cdb0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2cdc0 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2cdd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cde0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2cdf0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
2ce00 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
2ce10 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
2ce20 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
2ce30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2ce40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ce50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2ce60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
2ce70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
2ce80 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
2ce90 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
2cea0 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
2ceb0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
2cec0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ced0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2cee0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
2cef0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
2cf00 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21  pIn->eEndLoopOp!
2cf10 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
2cf20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2cf30 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e  eAddOp2(v, pIn->
2cf40 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d  eEndLoopOp, pIn-
2cf50 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
2cf60 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
2cf70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2cf80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2cf90 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2cfa0 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d  In->eEndLoopOp==
2cfb0 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a  OP_PrevIfOpen);.
2cfc0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2cfd0 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d  verageIf(v, pIn-
2cfe0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f  >eEndLoopOp==OP_
2cff0 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20  NextIfOpen);.   
2d000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2d010 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d020 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
2d030 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
2d040 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2d050 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2d060 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2d070 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
2d080 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2d090 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d0a0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
2d0b0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
2d0c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d0d0 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70  t((v, "next skip
2d0e0 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c  -scan on %s", pL
2d0f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2d100 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
2d110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d120 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2d130 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
2d140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d150 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65  umpHere(v, pLeve
2d160 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a  l->addrSkip-2);.
2d170 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2d180 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54  LITE_LIKE_DOESNT
2d190 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20  _MATCH_BLOBS.   
2d1a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
2d1b0 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20  rLikeRep ){.    
2d1c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d1d0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
2d1e0 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c  mpZero, (int)(pL
2d1f0 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e  evel->iLikeRepCn
2d200 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20  tr>>1),.        
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
2d230 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Rep);.      Vdbe
2d240 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2d250 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
2d260 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
2d270 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
2d280 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46   ws = pLoop->wsF
2d290 6c 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72  lags;.      addr
2d2a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2d2b0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
2d2c0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
2d2d0 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  oin); VdbeCovera
2d2e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  ge(v);.      ass
2d2f0 65 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45  ert( (ws & WHERE
2d300 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c  _IDX_ONLY)==0 ||
2d310 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
2d320 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
2d330 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
2d340 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
2d350 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d360 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2d370 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
2d380 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2d390 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2d3a0 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
2d3b0 45 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20  E_INDEXED) .    
2d3c0 20 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45     || ((ws & WHE
2d3d0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20  RE_MULTI_OR) && 
2d3e0 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
2d3f0 78 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  x) .      ){.   
2d400 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d410 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
2d420 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
2d430 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
2d440 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
2d450 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
2d460 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2d470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d480 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
2d490 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
2d4a0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
2d4b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2d4c0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2d4d0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2d4e0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
2d4f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d500 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
2d510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65  ;.    }.    Vdbe
2d520 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2d530 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f  , "End WHERE-loo
2d540 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20  p%d: %s", i,.   
2d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d560 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2d570 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2d580 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  rom].pTab->zName
2d590 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ));.  }..  /* Th
2d5a0 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
2d5b0 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
2d5c0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2d5d0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
2d5e0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
2d5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2d600 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
2d610 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
2d620 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2d630 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73  >nLevel<=pTabLis
2d640 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
2d650 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
2d660 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
2d670 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
2d680 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
2d690 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56  t k, last;.    V
2d6a0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
2d6b0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b  Index *pIdx = 0;
2d6c0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2d6d0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2d6e0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2d6f0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2d700 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2d710 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
2d720 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
2d730 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pTab!=0 );.    p
2d740 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2d750 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46  WLoop;..    /* F
2d760 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  or a co-routine,
2d770 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43   change all OP_C
2d780 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73  olumn references
2d790 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66   to the table of
2d7a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72  .    ** the co-r
2d7b0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43  outine into OP_C
2d7c0 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  opy of result co
2d7d0 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67  ntained in a reg
2d7e0 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50  ister..    ** OP
2d7f0 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f  _Rowid becomes O
2d800 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  P_Null..    */. 
2d810 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
2d820 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2d830 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
2d840 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  se( pParse->db->
2d850 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2d860 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
2d870 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72  olumnToCopy(pPar
2d880 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  se, pLevel->addr
2d890 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Body, pLevel->iT
2d8a0 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8c0 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67     pTabItem->reg
2d8d0 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20  Result, 0);.    
2d8e0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2d8f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
2d900 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
2d910 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
2d920 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
2d930 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
2d940 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
2d950 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
2d960 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2d970 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
2d980 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
2d990 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
2d9a0 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
2d9b0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
2d9c0 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
2d9d0 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
2d9e0 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
2d9f0 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
2da00 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
2da10 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
2da20 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
2da30 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
2da40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2da50 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
2da60 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
2da70 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
2da80 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
2da90 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
2daa0 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
2dab0 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
2dac0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
2dad0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
2dae0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
2daf0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
2db00 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
2db10 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
2db20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
2db30 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
2db40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2db50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2db60 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
2db70 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
2db80 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
2db90 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2dba0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
2dbb0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2dbc0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
2dbd0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
2dbe0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
2dbf0 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
2dc00 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20    if( pIdx.     
2dc10 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  && (pWInfo->eOne
2dc20 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2dc30 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  F || !HasRowid(p
2dc40 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20  Idx->pTable)).  
2dc50 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f     && !db->mallo
2dc60 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20  cFailed.    ){. 
2dc70 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
2dc80 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2dc90 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d  dr(v);.      k =
2dca0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
2dcb0 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  y;.      pOp = s
2dcc0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2dcd0 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  v, k);.      for
2dce0 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  (; k<last; k++, 
2dcf0 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
2dd00 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
2dd10 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
2dd20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2dd30 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2dd40 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
2dd50 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d           int x =
2dd60 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
2dd70 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
2dd80 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  ->pTable==pTab )
2dd90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2dda0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2ddb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ){.            I
2ddc0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
2ddd0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2dde0 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
2ddf0 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61        x = pPk->a
2de00 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20  iColumn[x];.    
2de10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2de20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
2de30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20    }.          x 
2de40 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
2de50 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b  fIndex(pIdx, x);
2de60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
2de70 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2de80 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a     pOp->p2 = x;.
2de90 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
2dea0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2deb0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2dec0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2ded0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2dee0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2def0 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d  _ONLY)==0 || x>=
2df00 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
2df10 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65   || pWInfo->eOne
2df20 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20  Pass );.        
2df30 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
2df40 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
2df50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
2df60 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2df70 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2df80 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
2df90 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
2dfa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2dfb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
2dfc0 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
2dfd0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
2dfe0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2dff0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2e000 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
2e010 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2e020 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.