/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 69eb9080ca38ee9cb4d149e9ef3b9fe942299251:


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 56 64 62  umnToCopy(.  Vdb
4530: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
4540: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 6f 6e   /* The VDBE con
4550: 74 61 69 6e 69 6e 67 20 63 6f 64 65 20 74 6f 20  taining code to 
4560: 74 72 61 6e 73 6c 61 74 65 20 2a 2f 0a 20 20 69  translate */.  i
4570: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4580: 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20     /* Translate 
4590: 66 72 6f 6d 20 74 68 69 73 20 6f 70 63 6f 64 65  from this opcode
45a0: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   to the end */. 
45b0: 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
45c0: 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d       /* OP_Colum
45d0: 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65 66 65 72  n/OP_Rowid refer
45e0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
45f0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
4600: 67 69 73 74 65 72 2c 20 20 20 20 20 20 2f 2a 20  gister,      /* 
4610: 54 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  The first column
4620: 20 69 73 20 69 6e 20 74 68 69 73 20 72 65 67 69   is in this regi
4630: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ster */.  int bI
4640: 6e 63 72 52 6f 77 69 64 20 20 20 20 20 20 2f 2a  ncrRowid      /*
4650: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72   If non-zero, tr
4660: 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f 77 69 64  ansform OP_rowid
4670: 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d 28 31 29   to OP_AddImm(1)
4680: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70 20   */.){.  VdbeOp 
4690: 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  *pOp = sqlite3Vd
46a0: 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61 72  beGetOp(v, iStar
46b0: 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  t);.  int iEnd =
46c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
46d0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66 6f  entAddr(v);.  fo
46e0: 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b  r(; iStart<iEnd;
46f0: 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b   iStart++, pOp++
4700: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ){.    if( pOp->
4710: 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f  p1!=iTabCur ) co
4720: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4730: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
4740: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
4750: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
4760: 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70  _Copy;.      pOp
4770: 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b  ->p1 = pOp->p2 +
4780: 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20   iRegister;.    
4790: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d    pOp->p2 = pOp-
47a0: 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  >p3;.      pOp->
47b0: 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  p3 = 0;.    }els
47c0: 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
47d0: 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
47e0: 20 20 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f       if( bIncrRo
47f0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
4800: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
4810: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
4820: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4830: 66 20 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20  f the OP_Rowid. 
4840: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
4850: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49  opcode = OP_AddI
4860: 6d 6d 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  mm;.        pOp-
4870: 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  >p1 = pOp->p2;. 
4880: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
4890: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
48a0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
48b0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
48c0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
48d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 0;.        pOp
48e0: 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->p3 = 0;.      
48f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
4900: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
4910: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
4920: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
4930: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
4940: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
4950: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
4960: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
4970: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
4980: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
4990: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
49a0: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
49b0: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
49c0: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
49d0: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
49e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
49f0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
4a00: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
4a10: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74  CE_ENABLED).stat
4a20: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
4a30: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
4a40: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
4a50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4a60: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
4a70: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
4a80: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
4a90: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
4aa0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4ab0: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
4ac0: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
4ad0: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
4ae0: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
4af0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
4b00: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4b10: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
4b20: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
4b30: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
4b40: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4b50: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
4b60: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4b70: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
4b80: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4b90: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
4ba0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4bb0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
4bc0: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
4bd0: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
4be0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
4bf0: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
4c00: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4c10: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
4c20: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
4c30: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
4c40: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
4c50: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
4c60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4c70: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
4c80: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
4c90: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
4ca0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
4cb0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4cc0: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
4cd0: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
4ce0: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
4cf0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4d00: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
4d10: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
4d20: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
4d30: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
4d40: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
4d50: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d60: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
4d70: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
4d80: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4d90: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
4da0: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
4dd0: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
4de0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
4df0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4e00: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
4e10: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
4e20: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
4e30: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4e40: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
4e50: 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70  dRows=%lld\n", p
4e60: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
4e70: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
4e80: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
4e90: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
4ea0: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
4eb0: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
4ec0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4ed0: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
4ee0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4ef0: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
4f00: 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
4f10: 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
4f20: 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
4f30: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
4f40: 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
4f50: 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
4f60: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
4f70: 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
4f80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
4f90: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
4fa0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
4fb0: 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
4fc0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
4fd0: 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
4fe0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
4ff0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
5000: 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
5010: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
5020: 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
5030: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
5040: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
5050: 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
5060: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
5070: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
5080: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5090: 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
50a0: 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
50b0: 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  ;.  if( (pTerm->
50c0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
50d0: 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  EQ|WO_IS))==0 ) 
50e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
50f0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
5100: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
5110: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5120: 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65   if( pTerm->u.le
5130: 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  ftColumn<0 ) ret
5140: 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70  urn 0;.  aff = p
5150: 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Src->pTab->aCol[
5160: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
5170: 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  umn].affinity;. 
5180: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
5190: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65  exAffinityOk(pTe
51a0: 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20  rm->pExpr, aff) 
51b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65  ) return 0;.  te
51c0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
51d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
51e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
51f0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
5200: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5210: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
5220: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
5230: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
5240: 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
5250: 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
5260: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
5270: 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
5280: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
5290: 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
52a0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
52b0: 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
52c0: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
52d0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
52e0: 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
52f0: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
5300: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5320: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
5330: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
5340: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
5350: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
5360: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
5370: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
5380: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
5390: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
53a0: 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
53b0: 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
53c0: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
53d0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
53e0: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
53f0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
5400: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
5410: 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
5420: 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
5430: 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
5440: 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
5470: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
5480: 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
5490: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
54a0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
54b0: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
54c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
54d0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
54e0: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
54f0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
5500: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78  ->a[] */.  Index
5510: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
5520: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
5530: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
5540: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
5550: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
5580: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
5590: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
55a0: 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20  nt addrInit;    
55b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
55c0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69  dress of the ini
55d0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61  tialization bypa
55e0: 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62  ss jump */.  Tab
55f0: 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20  le *pTable;     
5600: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5610: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
5620: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  xed */.  int add
5630: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
5640: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
5650: 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
5660: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
5670: 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
5680: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5690: 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
56a0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
56b0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
56c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
56d0: 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
56e0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5700: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
5710: 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5730: 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
5740: 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
5750: 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
5760: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
5770: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
5780: 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
5790: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
57a0: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
57b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
57c0: 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  op object */.  c
57d0: 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20  har *zNotUsed;  
57e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
57f0: 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65  tra space on the
5800: 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a   end of pIdx */.
5810: 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
5820: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
5830: 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
5840: 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
5850: 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
5860: 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
5870: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
5880: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
5890: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65  lumns */.  u8 se
58a0: 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20  ntWarning = 0;  
58b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
58c0: 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73  f a warnning has
58d0: 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
58e0: 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c    Expr *pPartial
58f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5900: 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45   Partial Index E
5910: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
5920: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30  nt iContinue = 0
5930: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
5940: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
5950: 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f  excluded rows */
5960: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
5970: 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
5980: 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
5990: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e 64  e term being ind
59a0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
59b0: 64 72 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20  drCounter = 0;  
59c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
59d0: 20 77 68 65 72 65 20 69 6e 74 65 67 65 72 20 63   where integer c
59e0: 6f 75 6e 74 65 72 20 69 73 20 69 6e 69 74 69 61  ounter is initia
59f0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  lized */.  int r
5a00: 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
5a10: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
5a20: 6f 66 20 72 65 67 69 73 74 65 72 73 20 77 68 65  of registers whe
5a30: 72 65 20 72 65 63 6f 72 64 20 69 73 20 61 73 73  re record is ass
5a40: 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  embled */..  /* 
5a50: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
5a60: 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
5a70: 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
5a80: 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
5a90: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
5aa0: 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
5ab0: 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
5ac0: 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
5ad0: 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
5ae0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
5af0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
5b00: 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
5b10: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
5b20: 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
5b30: 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
5b40: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
5b50: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
5b60: 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  at will be added
5b70: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20   to the index.  
5b80: 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  ** and used to m
5b90: 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  atch WHERE claus
5ba0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
5bb0: 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a  .  nKeyCol = 0;.
5bc0: 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
5bd0: 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20  >pTab;.  pWCEnd 
5be0: 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
5bf0: 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d  Term];.  pLoop =
5c00: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
5c10: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
5c20: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
5c30: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
5c40: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
5c50: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
5c60: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
5c70: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5c80: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
5c90: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20  EP_FromJoin)    
5ca0: 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79 73  /* prereq always
5cb0: 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20   non-zero */.   
5cc0: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
5cd0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21  iRightJoinTable!
5ce0: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20  =pSrc->iCursor  
5cf0: 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69   /*   for the ri
5d00: 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20  ght-hand   */.  
5d10: 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d         || pLoop-
5d20: 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20  >prereq!=0 );   
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20    /*   table of 
5d50: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20  a LEFT JOIN */. 
5d60: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72     if( pLoop->pr
5d70: 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20  ereq==0.     && 
5d80: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
5d90: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d  & TERM_VIRTUAL)=
5da0: 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70 72  =0.     && !Expr
5db0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5dc0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
5dd0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
5de0: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
5df0: 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e  nt(pExpr, pSrc->
5e00: 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
5e10: 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c    pPartial = sql
5e20: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
5e30: 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c  se->db, pPartial
5e40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
5e70: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
5e80: 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pr, 0));.    }. 
5e90: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
5ea0: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
5eb0: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
5ec0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
5ed0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
5ee0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
5ef0: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
5f00: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
5f10: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
5f20: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
5f30: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
5f40: 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65  =BMS );.      te
5f50: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
5f60: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  S-1 );.      if(
5f70: 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b   !sentWarning ){
5f80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f90: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
5fa0: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20  ING_AUTOINDEX,. 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74 6f             "auto
5fc0: 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25  matic index on %
5fd0: 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e  s(%s)", pTable->
5fe0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
5ff0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b     pTable->aCol[
6000: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  iCol].zName);.  
6010: 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e        sentWarnin
6020: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 1;.      }. 
6030: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
6040: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
6050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65  .        if( whe
6060: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61  reLoopResize(pPa
6070: 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20  rse->db, pLoop, 
6080: 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20  nKeyCol+1) ){.  
6090: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
60a0: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
60b0: 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  te;.        }.  
60c0: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
60d0: 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d  erm[nKeyCol++] =
60e0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
60f0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
6100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6110: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b    }.  assert( nK
6120: 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f  eyCol>0 );.  pLo
6130: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
6140: 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  = pLoop->nLTerm 
6150: 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f  = nKeyCol;.  pLo
6160: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
6170: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
6180: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
6190: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20   WHERE_INDEXED. 
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f      | WHERE_AUTO
61c0: 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f  _INDEX;..  /* Co
61d0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
61e0: 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
61f0: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63  umns needed to c
6200: 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76  reate a.  ** cov
6210: 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20  ering index.  A 
6220: 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22  "covering index"
6230: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
6240: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20  t contains all. 
6250: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   ** columns that
6260: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
6270: 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20  he query.  With 
6280: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
6290: 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  , the.  ** origi
62a0: 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20  nal table never 
62b0: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65  needs to be acce
62c0: 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63  ssed.  Automatic
62d0: 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20   indices must.  
62e0: 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67  ** be a covering
62f0: 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74   index because t
6300: 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  he index will no
6310: 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  t be updated if 
6320: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
6330: 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20  l table changes 
6340: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e  and the index an
6350: 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  d table cannot b
6360: 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  oth be used.  **
6370: 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20   if they go out 
6380: 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  of sync..  */.  
6390: 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63  extraCols = pSrc
63a0: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64  ->colUsed & (~id
63b0: 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28  xCols | MASKBIT(
63c0: 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74  BMS-1));.  mxBit
63d0: 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c  Col = MIN(BMS-1,
63e0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20  pTable->nCol);. 
63f0: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
6400: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
6410: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
6420: 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
6430: 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
6440: 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
6450: 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
6460: 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
6470: 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20   ) nKeyCol++;.  
6480: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
6490: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
64a0: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b  BMS-1) ){.    nK
64b0: 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d  eyCol += pTable-
64c0: 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
64d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
64e0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
64f0: 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
6500: 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
6510: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
6520: 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
6530: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
6540: 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a  nKeyCol+1, 0, &z
6550: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
6560: 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pIdx==0 ) goto e
6570: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
6580: 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  eate;.  pLoop->u
6590: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
65a0: 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e  pIdx;.  pIdx->zN
65b0: 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65  ame = "auto-inde
65c0: 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  x";.  pIdx->pTab
65d0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
65e0: 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
65f0: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
6600: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
6610: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
6620: 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
6630: 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
6640: 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
6650: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
6660: 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
6670: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
6680: 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
6690: 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
66a0: 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
66b0: 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
66c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
66d0: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
66e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
66f0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
6700: 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
6710: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
6720: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
6730: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
6740: 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
6750: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
6760: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6770: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
6780: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
6790: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
67a0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
67b0: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
67c0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
67d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
67e0: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f  >azColl[n] = pCo
67f0: 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll ? pColl->zNam
6800: 65 20 3a 20 73 71 6c 69 74 65 33 53 74 72 42 49  e : sqlite3StrBI
6810: 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b  NARY;.        n+
6820: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
6830: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
6840: 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e  u32)n==pLoop->u.
6850: 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20  btree.nEq );..  
6860: 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
6870: 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
6880: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
6890: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
68a0: 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
68b0: 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
68c0: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
68d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
68e0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
68f0: 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20  BIT(i) ){.      
6900: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
6910: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
6920: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73  x->azColl[n] = s
6930: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
6940: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
6950: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
6960: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
6970: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
6980: 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
6990: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
69a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
69b0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
69c0: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
69d0: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
69e0: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
69f0: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6a00: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b  .  assert( n==nK
6a10: 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d  eyCol );.  pIdx-
6a20: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58  >aiColumn[n] = X
6a30: 4e 5f 52 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d  N_ROWID;.  pIdx-
6a40: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c  >azColl[n] = sql
6a50: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a  ite3StrBINARY;..
6a60: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
6a70: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6a80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  */.  assert( pLe
6a90: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
6aa0: 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64  );.  pLevel->iId
6ab0: 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
6ac0: 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
6ad0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6ae0: 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
6af0: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
6b00: 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73   nKeyCol+1);.  s
6b10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
6b20: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
6b30: 49 64 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Idx);.  VdbeComm
6b40: 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22  ent((v, "for %s"
6b50: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
6b60: 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68  );..  /* Fill th
6b70: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
6b80: 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a  x with content *
6b90: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
6ba0: 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
6bb0: 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
6bc0: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61  pWC->pWInfo->pTa
6bd0: 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
6be0: 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70  >iFrom];.  if( p
6bf0: 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  TabItem->fg.viaC
6c00: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6c10: 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
6c20: 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
6c30: 72 6e 3b 0a 20 20 20 20 61 64 64 72 43 6f 75 6e  rn;.    addrCoun
6c40: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ter = sqlite3Vdb
6c50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6c60: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
6c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c80: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
6c90: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
6ca0: 64 2c 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e  d, 0, pTabItem->
6cb0: 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
6cc0: 20 20 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c    addrTop =  sql
6cd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6ce0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
6cf0: 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43  ield);.    VdbeC
6d00: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6d10: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6d20: 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25  "next row of \"%
6d30: 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e  s\"", pTabItem->
6d40: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
6d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
6d60: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
6d70: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
6d80: 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  wind, pLevel->iT
6d90: 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65  abCur); VdbeCove
6da0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
6db0: 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20  f( pPartial ){. 
6dc0: 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73     iContinue = s
6dd0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6de0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
6df0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
6e00: 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c  Parse, pPartial,
6e10: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49   iContinue, SQLI
6e20: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
6e30: 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
6e40: 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54  gs |= WHERE_PART
6e50: 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65  IALIDX;.  }.  re
6e60: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
6e70: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6e80: 73 65 29 3b 0a 20 20 72 65 67 42 61 73 65 20 3d  se);.  regBase =
6e90: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
6ea0: 49 6e 64 65 78 4b 65 79 28 0a 20 20 20 20 20 20  IndexKey(.      
6eb0: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
6ec0: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
6ed0: 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20  egRecord, 0, 0, 
6ee0: 30 2c 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69  0, 0.  );.  sqli
6ef0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6f00: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
6f10: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
6f20: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
6f30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6f40: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
6f50: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66  EEKRESULT);.  if
6f60: 28 20 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c  ( pPartial ) sql
6f70: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6f80: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
6f90: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  e);.  if( pTabIt
6fa0: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
6fb0: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
6fc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
6fd0: 2c 20 61 64 64 72 43 6f 75 6e 74 65 72 2c 20 72  , addrCounter, r
6fe0: 65 67 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74  egBase+n);.    t
6ff0: 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f  ranslateColumnTo
7000: 43 6f 70 79 28 76 2c 20 61 64 64 72 54 6f 70 2c  Copy(v, addrTop,
7010: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7020: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52  , pTabItem->regR
7030: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 73  esult, 1);.    s
7040: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
7050: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
7060: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
7070: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
7080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
7090: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
70a0: 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
70b0: 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
70c0: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
70d0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
70e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
70f0: 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  5(v, SQLITE_STMT
7100: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
7110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7120: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
7130: 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Top);.  sqlite3R
7140: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
7150: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
7160: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
7170: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
7180: 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  .  .  /* Jump he
7190: 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67  re when skipping
71a0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
71b0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
71c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
71d0: 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f  addrInit);..end_
71e0: 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
71f0: 65 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  e:.  sqlite3Expr
7200: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7210: 62 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a  b, pPartial);.}.
7220: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7230: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
7240: 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
7250: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7260: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
7270: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
7280: 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
7290: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
72a0: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
72b0: 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
72c0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
72d0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
72e0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
72f0: 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
7300: 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
7310: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7320: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
7330: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
7340: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
7350: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
7360: 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
7370: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
7380: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7390: 57 43 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55  WC,.  Bitmask mU
73a0: 6e 75 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20  nusable,        
73b0: 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20        /* Ignore 
73c0: 74 65 72 6d 73 20 77 69 74 68 20 74 68 65 73 65  terms with these
73d0: 20 70 72 65 72 65 71 73 20 2a 2f 0a 20 20 73 74   prereqs */.  st
73e0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
73f0: 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  m *pSrc,.  ExprL
7400: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20  ist *pOrderBy,. 
7410: 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20   u16 *pmNoOmit  
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d   /* Mask of term
7440: 73 20 6e 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f  s not to omit */
7450: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
7460: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
7470: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7480: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
7490: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
74a0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
74b0: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
74c0: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
74d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
74e0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
74f0: 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
7500: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
7510: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
7520: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7530: 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 75 31   *pIdxInfo;.  u1
7540: 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a  6 mNoOmit = 0;..
7550: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
7560: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
7570: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
7580: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
7590: 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
75a0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
75b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
75c0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
75d0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
75e0: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
75f0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
7600: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
7610: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
7620: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
7630: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7640: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
7650: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7660: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
7670: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
7680: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
7690: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
76a0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
76b0: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
76c0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
76d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
76e0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
76f0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7700: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7710: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7720: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7730: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
7740: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
7750: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
7760: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
7770: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f  |WO_IS))==0 ) co
7780: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
7790: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
77a0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
77b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
77c0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
77d0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
77e0: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
77f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
7800: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
7810: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
7820: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
7830: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
7840: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
7850: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7860: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
7870: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
7880: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7890: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
78a0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
78b0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
78c0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
78d0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
78e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
78f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
7900: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7910: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7920: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7930: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7940: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
7950: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
7960: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7970: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
7980: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
7990: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
79a0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
79b0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
79c0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
79d0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
79e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
79f0: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
7a00: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
7a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
7a30: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
7a40: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
7a50: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
7a80: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
7a90: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
7aa0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
7ab0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7ac0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
7ad0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
7ae0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7af0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
7b00: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
7b10: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7b20: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
7b30: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
7b40: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
7b50: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
7b60: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
7b70: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
7b80: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
7b90: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
7ba0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
7bb0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
7bc0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
7bd0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
7be0: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
7bf0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7c00: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7c10: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
7c20: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
7c30: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7c40: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
7c50: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
7c60: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
7c70: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7c80: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7c90: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
7ca0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
7cb0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7cc0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
7cd0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
7ce0: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
7cf0: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
7d00: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7d10: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7d20: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
7d30: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
7d40: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
7d50: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7d60: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
7d70: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
7d80: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
7d90: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7da0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7db0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
7dc0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
7dd0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
7e20: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
7e30: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7e40: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7e50: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
7e60: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
7e70: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7e80: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7e90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7ea0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
7eb0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
7ec0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
7ed0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
7ee0: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
7ef0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7f00: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7f10: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7f20: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7f30: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7f40: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7f50: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7f60: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7f70: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7f80: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
7f90: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7fa0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7fb0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
7fc0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7fd0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
7fe0: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
7ff0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8000: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
8010: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
8020: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
8030: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
8040: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
8050: 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78  (-1) );.    pIdx
8060: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
8070: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
8080: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
8090: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
80a0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
80b0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
80c0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
80d0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
80e0: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
80f0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d      if( op==WO_M
8100: 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70  ATCH ){.      op
8110: 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68   = pTerm->eMatch
8120: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  Op;.    }.    pI
8130: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
8140: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
8150: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8160: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8170: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
8180: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
8190: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
81a0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
81b0: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
81c0: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
81d0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
81e0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
81f0: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
8200: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
8210: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8220: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8230: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8240: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
8250: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
8260: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8270: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
8280: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
8290: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
82a0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
82b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
82c0: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
82d0: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
82e0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
82f0: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
8300: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
8310: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8320: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
8330: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8340: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
8350: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
8360: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8370: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 0a  E|WO_MATCH) );..
8380: 20 20 20 20 69 66 28 20 6f 70 20 26 20 28 57 4f      if( op & (WO
8390: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
83a0: 57 4f 5f 47 45 29 0a 20 20 20 20 20 26 26 20 73  WO_GE).     && s
83b0: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
83c0: 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  or(pTerm->pExpr-
83d0: 3e 70 52 69 67 68 74 29 20 0a 20 20 20 20 29 7b  >pRight) .    ){
83e0: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 31 36 20  .      if( i<16 
83f0: 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d 20 28 31 20  ) mNoOmit |= (1 
8400: 3c 3c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  << i);.      if(
8410: 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29 20 70 49 64   op==WO_LT ) pId
8420: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f  xCons[j].op = WO
8430: 5f 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  _LE;.      if( o
8440: 70 3d 3d 57 4f 5f 47 54 20 29 20 70 49 64 78 43  p==WO_GT ) pIdxC
8450: 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47  ons[j].op = WO_G
8460: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 2b  E;.    }..    j+
8470: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
8480: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
8490: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
84a0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
84b0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
84c0: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
84d0: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
84e0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
84f0: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
8500: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8510: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
8520: 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20  ..  *pmNoOmit = 
8530: 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65 74 75 72  mNoOmit;.  retur
8540: 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
8550: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
8560: 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
8570: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
8580: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
8590: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
85a0: 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
85b0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
85c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
85d0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
85e0: 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
85f0: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
8600: 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
8610: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8620: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
8630: 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
8640: 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
8650: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8660: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8670: 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
8680: 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
8690: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
86a0: 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
86b0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
86c0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
86d0: 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
86e0: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
86f0: 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
8700: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
8710: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
8720: 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
8730: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
8740: 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
8750: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
8760: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
8770: 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
8780: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
8790: 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
87a0: 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
87b0: 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
87c0: 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
87d0: 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
87e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
87f0: 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
8800: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
8810: 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
8820: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
8830: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
8840: 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
8850: 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
8860: 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
8870: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54  ;.  int rc;..  T
8880: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
8890: 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
88a0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
88b0: 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
88c0: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
88d0: 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20  PUTS(p);..  if( 
88e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
88f0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8900: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
8910: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
8920: 6c 74 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  lt(pParse->db);.
8930: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
8940: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
8950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8960: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8970: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
8980: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
8990: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
89a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
89b0: 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
89c0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
89d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
89e0: 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
89f0: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
8a00: 4d 73 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a  Msg = 0;..#if 0.
8a10: 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
8a20: 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79  is now caught by
8a30: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
8a40: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 22 78 42  * Search for "xB
8a50: 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63  estIndex malfunc
8a60: 74 69 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20  tion" below */. 
8a70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8a80: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
8a90: 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
8aa0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
8ab0: 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
8ac0: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
8ad0: 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
8ae0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8af0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8b00: 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
8b10: 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
8b20: 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
8b30: 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
8b40: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  me);.    }.  }.#
8b50: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
8b60: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
8b70: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
8b80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8b90: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
8ba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8bb0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
8bc0: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
8bd0: 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
8be0: 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
8bf0: 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
8c00: 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
8c10: 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
8c20: 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
8c30: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
8c40: 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
8c50: 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
8c60: 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
8c70: 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61   pRec.**    aSta
8c80: 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
8c90: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
8ca0: 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a  ual to pRec.**.*
8cb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
8cc0: 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65  ex of the sample
8cd0: 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61   that is the sma
8ce0: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61  llest sample tha
8cf0: 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
8d00: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8d10: 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74   pRec. Note that
8d20: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   this index is n
8d30: 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69  ot an index.** i
8d40: 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  nto the aSample[
8d50: 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20  ] array - it is 
8d60: 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20  an index into a 
8d70: 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73  virtual set of s
8d80: 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20  amples.** based 
8d90: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
8da0: 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64  of aSample[] and
8db0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
8dc0: 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20  ields in record 
8dd0: 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74  .** pRec. .*/.st
8de0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
8df0: 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
8e00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8e10: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8e20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8e30: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e50: 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
8e60: 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
8e70: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
8e80: 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
8e90: 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
8ea0: 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
8eb0: 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ed0: 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
8ee0: 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
8ef0: 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
8f00: 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
8f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8f20: 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
8f30: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
8f40: 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
8f50: 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
8f60: 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
8f90: 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
8fa0: 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
8fb0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8fd0: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61  ndex of first sa
8fe0: 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a  mple >= pRec */.
8ff0: 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20    int iSample;  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9010: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
9020: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
9030: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
9040: 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9060: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
9070: 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
9080: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
90b0: 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
90c0: 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
90d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
90e0: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
90f0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
9100: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9120: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9130: 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52   in pRec */.  tR
9140: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30  owcnt iLower = 0
9150: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c  ;         /* anL
9160: 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20  t[] + anEq[] of 
9170: 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70  largest sample p
9180: 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66  Rec is > */..#if
9190: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
91a0: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
91b0: 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
91c0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
91d0: 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73   pRec!=0 );.  as
91e0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
91f0: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
9200: 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
9210: 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c  0 && pRec->nFiel
9220: 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  d<=pIdx->nSample
9230: 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  Col );..  /* Do 
9240: 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
9250: 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  to find the firs
9260: 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72  t sample greater
9270: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20   than or equal. 
9280: 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20   ** to pRec. If 
9290: 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20  pRec contains a 
92a0: 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68  single field, th
92b0: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
92c0: 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20   to search.  ** 
92d0: 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53  is simply the aS
92e0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49  ample[] array. I
92f0: 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e  f the samples in
9300: 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61   aSample[] conta
9310: 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61  in more.  ** tha
9320: 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c  n one fields, al
9330: 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69  l fields followi
9340: 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65  ng the first are
9350: 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20   ignored..  **. 
9360: 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74   ** If pRec cont
9370: 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77  ains N fields, w
9380: 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74  here N is more t
9390: 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73  han one, then as
93a0: 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a   well as the.  *
93b0: 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  * samples in aSa
93c0: 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65  mple[] (truncate
93d0: 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20  d to N fields), 
93e0: 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20  the search also 
93f0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73  has to.  ** cons
9400: 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66  ider prefixes of
9410: 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20   those samples. 
9420: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
9430: 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
9440: 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70  es.  ** in aSamp
9450: 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  le is:.  **.  **
9460: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20       aSample[0] 
9470: 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (a, 5) .  **  
9480: 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20     aSample[1] = 
9490: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
94a0: 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28    aSample[2] = (
94b0: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
94c0: 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c  aSample[3] = (c,
94d0: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
94e0: 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c  aSample[4] = (c,
94f0: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
9500: 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20  Then the search 
9510: 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65  space should ide
9520: 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70  ally be the samp
9530: 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68  les above and th
9540: 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70  e .  ** unique p
9550: 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d  refixes [a], [b]
9560: 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69   and [c]. But si
9570: 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64  nce that is hard
9580: 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20   to organize, . 
9590: 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74   ** the code act
95a0: 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74  ually searches t
95b0: 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20  his set:.  **.  
95c0: 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20  **     0: (a) . 
95d0: 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35   **     1: (a, 5
95e0: 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28  ) .  **     2: (
95f0: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
9600: 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   3: (a, 10) .  *
9610: 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20  *     4: (b) .  
9620: 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29  **     5: (b, 5)
9630: 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63   .  **     6: (c
9640: 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28  ) .  **     7: (
9650: 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
9660: 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20    8: (c, 105).  
9670: 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30  **     9: (c, 10
9680: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  5).  **.  ** For
9690: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20   each sample in 
96a0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
96b0: 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61  ray, N samples a
96c0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
96d0: 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  e.  ** effective
96e0: 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49   sample array. I
96f0: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d  n the above, sam
9700: 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65  ples 0 and 1 are
9710: 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20   based on .  ** 
9720: 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30  sample aSample[0
9730: 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64  ]. Samples 2 and
9740: 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d   3 on aSample[1]
9750: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
9760: 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20  Often, sample i 
9770: 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  of each block of
9780: 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d   N effective sam
9790: 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66  ples has (i+1) f
97a0: 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65  ields..  ** Exce
97b0: 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20  pt, each sample 
97c0: 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20  may be extended 
97d0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  to ensure that i
97e0: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
97f0: 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20  n or.  ** equal 
9800: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
9810: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72  sample in the ar
9820: 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ray. For example
9830: 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  , in the above, 
9840: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69  .  ** sample 2 i
9850: 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
9860: 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66  le of a block of
9870: 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61   N samples, so a
9880: 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a  t first it .  **
9890: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
98a0: 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65   should be 1 fie
98b0: 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65  ld in size. Howe
98c0: 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20  ver, that would 
98d0: 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d  make it .  ** sm
98e0: 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  aller than sampl
98f0: 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61  e 1, so the bina
9900: 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20  ry search would 
9910: 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72  not work. As a r
9920: 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20  esult, .  ** it 
9930: 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74  is extended to t
9940: 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64  wo fields. The d
9950: 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74  uplicates that t
9960: 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e  his creates do n
9970: 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61  ot .  ** cause a
9980: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
9990: 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65  /.  nField = pRe
99a0: 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f  c->nField;.  iCo
99b0: 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65  l = 0;.  iSample
99c0: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
99d0: 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b   * nField;.  do{
99e0: 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20  .    int iSamp; 
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
9a10: 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74  Sample[] of test
9a20: 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69   sample */.    i
9a30: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a50: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9a60: 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20   in test sample 
9a70: 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20  */..    iTest = 
9a80: 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32  (iMin+iSample)/2
9a90: 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54  ;.    iSamp = iT
9aa0: 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20  est / nField;.  
9ab0: 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b    if( iSamp>0 ){
9ac0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  .      /* The pr
9ad0: 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65  oposed effective
9ae0: 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65   sample is a pre
9af0: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53  fix of sample aS
9b00: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20  ample[iSamp]..  
9b10: 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61      ** Specifica
9b20: 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73  lly, the shortes
9b30: 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c  t prefix of at l
9b40: 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25  east (1 + iTest%
9b50: 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a  nField) .      *
9b60: 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73  * fields that is
9b70: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
9b80: 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63  e previous effec
9b90: 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f  tive sample.  */
9ba0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54  .      for(n=(iT
9bb0: 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20  est % nField) + 
9bc0: 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b  1; n<nField; n++
9bd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9be0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e  Sample[iSamp-1].
9bf0: 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70  anLt[n-1]!=aSamp
9c00: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9c10: 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  -1] ) break;.   
9c20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9c30: 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20        n = iTest 
9c40: 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  + 1;.    }..    
9c50: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9c60: 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
9c70: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
9c80: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61  pare(aSample[iSa
9c90: 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  mp].n, aSample[i
9ca0: 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Samp].p, pRec);.
9cb0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
9cc0: 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
9cd0: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
9ce0: 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70  nLt[n-1] + aSamp
9cf0: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e  le[iSamp].anEq[n
9d00: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9d10: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
9d20: 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20  else if( res==0 
9d30: 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20  && n<nField ){. 
9d40: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9d50: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9d60: 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  t[n-1];.      iM
9d70: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
9d80: 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20      res = -1;.  
9d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
9da0: 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a  Sample = iTest;.
9db0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31        iCol = n-1
9dc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
9dd0: 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53  ( res && iMin<iS
9de0: 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69  ample );.  i = i
9df0: 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b  Sample / nField;
9e00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9e10: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
9e20: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
9e30: 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
9e40: 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
9e50: 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
9e60: 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
9e70: 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
9e80: 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
9e90: 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
9ea0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
9eb0: 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
9ec0: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  ts.  */.  if( pP
9ed0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9ee0: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
9ef0: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
9f00: 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d       /* If (res=
9f10: 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65  =0) is true, the
9f20: 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65  n pRec must be e
9f30: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
9f40: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
9f50: 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
9f60: 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  le );.      asse
9f70: 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64  rt( iCol==nField
9f80: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  -1 );.      pRec
9f90: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
9fa0: 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  d;.      assert(
9fb0: 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
9fc0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
9fd0: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
9fe0: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a  le[i].p, pRec) .
9ff0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
a000: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a010: 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b  Failed .      );
a020: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a030: 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70    /* Unless i==p
a040: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e  Idx->nSample, in
a050: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52  dicating that pR
a060: 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ec is larger tha
a070: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73  n.      ** all s
a080: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53  amples in the aS
a090: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70  ample[] array, p
a0a0: 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c  Rec must be smal
a0b0: 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ler than the.   
a0c0: 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66     ** (iCol+1) f
a0d0: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
a0e0: 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20  ample i.  */.   
a0f0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49     assert( i<=pI
a100: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69  dx->nSample && i
a110: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  >=0 );.      pRe
a120: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
a130: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
a140: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
a150: 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  le .           |
a160: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
a170: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a180: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
a190: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20  [i].p, pRec)>0. 
a1a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
a1b0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
a1c0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20  ailed );..      
a1d0: 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69  /* if i==0 and i
a1e0: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63  Col==0, then rec
a1f0: 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c  ord pRec is smal
a200: 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ler than all sam
a210: 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ples.      ** in
a220: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
a230: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
a240: 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65   if (iCol>0) the
a250: 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20  n pRec must.    
a260: 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20    ** be greater 
a270: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a280: 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c   the (iCol) fiel
a290: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
a2a0: 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49  le i..      ** I
a2b0: 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52  f (i>0), then pR
a2c0: 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ec must also be 
a2d0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d  greater than sam
a2e0: 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20  ple (i-1).  */. 
a2f0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
a300: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
a310: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a  >nField = iCol;.
a320: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a330: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a340: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a350: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
a360: 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20  ].p, pRec)<=0.  
a370: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
a380: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a390: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a3a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  }.      if( i>0 
a3b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
a3c0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
a3d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a3e0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
a3f0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a400: 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
a410: 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
a420: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <0.             
a430: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
a440: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
a450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a460: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
a470: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
a480: 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
a490: 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
a4a0: 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f  pRec is equal to
a4b0: 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20   sample i */.   
a4c0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
a4d0: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61  Field-1 );.    a
a4e0: 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
a4f0: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a500: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a510: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
a520: 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
a530: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
a540: 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b  oint, the (iCol+
a550: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a560: 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  of aSample[i] is
a570: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
a580: 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  ** sample that i
a590: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  s greater than p
a5a0: 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70  Rec. Or, if i==p
a5b0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65  Idx->nSample the
a5c0: 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73  n pRec.    ** is
a5d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
a5e0: 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
a5f0: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52  array. */.    tR
a600: 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47  owcnt iUpper, iG
a610: 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70  ap;.    if( i>=p
a620: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  Idx->nSample ){.
a630: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73        iUpper = s
a640: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
a650: 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
a660: 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Est[0]);.    }el
a670: 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
a680: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
a690: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  Lt[iCol];.    }.
a6a0: 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
a6b0: 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
a6c0: 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
a6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
a6e0: 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
a6f0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
a700: 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
a710: 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
a720: 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
a730: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
a740: 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
a750: 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
a760: 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53  r + iGap;.    aS
a770: 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
a780: 41 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d  AvgEq[iCol];.  }
a790: 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
a7a0: 68 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20  he pRec->nField 
a7b0: 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
a7c0: 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52  urning.  */.  pR
a7d0: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69  ec->nField = nFi
a7e0: 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  eld;.  return i;
a7f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a800: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a810: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  _OR_STAT4 */../*
a820: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
a830: 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20   NULL, pTerm is 
a840: 61 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76  a term that prov
a850: 69 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72  ides an upper or
a860: 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20   lower.** bound 
a870: 6f 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e  on a range scan.
a880: 20 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65   Without conside
a890: 72 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69  ring pTerm, it i
a8a0: 73 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20  s estimated .** 
a8b0: 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
a8c0: 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f  ll visit nNew ro
a8d0: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
a8e0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
a8f0: 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65  mber.** estimate
a900: 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20  d to be visited 
a910: 61 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65  after taking pTe
a920: 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e  rm into account.
a930: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
a940: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  er explicitly sp
a950: 65 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69  ecified a likeli
a960: 68 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72  hood() value for
a970: 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74   this term,.** t
a980: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
a990: 61 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65  alue is the like
a9a0: 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65  lihood multiplie
a9b0: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
a9c0: 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73  of.** input rows
a9d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69  . Otherwise, thi
a9e0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
a9f0: 65 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e  es that an "IS N
aa00: 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a  OT NULL" term.**
aa10: 20 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f   has a likelihoo
aa20: 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61  d of 0.50, and a
aa30: 6e 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20  ny other term a 
aa40: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e  likelihood of 0.
aa50: 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  25..*/.static Lo
aa60: 67 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41  gEst whereRangeA
aa70: 64 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20  djust(WhereTerm 
aa80: 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e  *pTerm, LogEst n
aa90: 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e  New){.  LogEst n
aaa0: 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66  Ret = nNew;.  if
aab0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69  ( pTerm ){.    i
aac0: 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
aad0: 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
aae0: 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nRet += pTerm->t
aaf0: 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65  ruthProb;.    }e
ab00: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
ab10: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
ab20: 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
ab30: 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20    nRet -= 20;   
ab40: 20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d       assert( 20=
ab50: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34  =sqlite3LogEst(4
ab60: 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) );.    }.  }. 
ab70: 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
ab80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ab90: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
aba0: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75  STAT4./*.** Retu
abb0: 72 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  rn the affinity 
abc0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  for a single col
abd0: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e  umn of an index.
abe0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
abf0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e  IndexColumnAffin
ac00: 69 74 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ity(sqlite3 *db,
ac10: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
ac20: 74 20 69 43 6f 6c 29 7b 0a 20 20 61 73 73 65 72  t iCol){.  asser
ac30: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
ac40: 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pIdx->nColumn
ac50: 20 29 3b 0a 20 20 69 66 28 20 21 70 49 64 78 2d   );.  if( !pIdx-
ac60: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
ac70: 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
ac80: 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 20  AffinityStr(db, 
ac90: 70 49 64 78 29 3d 3d 30 20 29 20 72 65 74 75 72  pIdx)==0 ) retur
aca0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
acb0: 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  B;.  }.  return 
acc0: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43  pIdx->zColAff[iC
acd0: 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ol];.}.#endif...
ace0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
acf0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
ad00: 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  AT4./* .** This 
ad10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ad20: 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
ad30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
ad40: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a  s visited by a.*
ad50: 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20  * range-scan on 
ad60: 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65  a skip-scan inde
ad70: 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  x. For example:.
ad80: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
ad90: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
ada0: 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c   b, c);.**   SEL
adb0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
adc0: 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45  ERE a=? AND c BE
add0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a  TWEEN ? AND ?;.*
ade0: 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70  *.** Value pLoop
adf0: 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e  ->nOut is curren
ae00: 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 65  tly set to the e
ae10: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
ae20: 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69  of rows .** visi
ae30: 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  ted for scanning
ae40: 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20   (a=? AND b=?). 
ae50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
ae60: 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69 6d  duces that estim
ae70: 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20  ate .** by some 
ae80: 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e  factor to accoun
ae90: 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45 54  t for the (c BET
aea0: 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78  WEEN ? AND ?) ex
aeb0: 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a  pression based.*
aec0: 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64  * on the stat4 d
aed0: 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ata for the inde
aee0: 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c  x. this scan wil
aef0: 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75  l be peformed mu
af00: 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
af10: 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20   (once for each 
af20: 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f  (a,b) combinatio
af30: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
af40: 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69 74  =?) is dealt wit
af50: 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  h .** by the cal
af60: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f  ler..**.** It do
af70: 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e  es this by scann
af80: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
af90: 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63  stat4 samples, c
afa0: 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a  omparing values.
afb0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
afc0: 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
afd0: 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f 72  per with the cor
afe0: 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
aff0: 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d  n in each.** sam
b000: 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20  ple. If L and U 
b010: 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  are the number o
b020: 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20  f samples found 
b030: 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
b040: 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  or.** equal to t
b050: 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61 63  he values extrac
b060: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
b070: 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
b080: 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20  ctively, and.** 
b090: 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  N is the total n
b0a0: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
b0b0: 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  , the pLoop->nOu
b0c0: 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73  t value is adjus
b0d0: 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  ted.** as follow
b0e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20  s:.**.**   nOut 
b0f0: 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55  = nOut * ( min(U
b100: 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a   - L, 1) / N ).*
b110: 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69  *.** If pLower i
b120: 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
b130: 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
b140: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
b150: 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65  term, L is.** se
b160: 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55  t to zero. If pU
b170: 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  pper is NULL, or
b180: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
b190: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
b1a0: 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65  m it,.** U is se
b1b0: 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  t to N..**.** No
b1c0: 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rmally, this fun
b1d0: 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f  ction sets *pbDo
b1e0: 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72  ne to 1 before r
b1f0: 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65  eturning. Howeve
b200: 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75  r,.** if no valu
b210: 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  e can be extract
b220: 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70  ed from either p
b230: 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72 20  Lower or pUpper 
b240: 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65  (and so the.** e
b250: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
b260: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
b270: 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20  livered remains 
b280: 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44  unchanged), *pbD
b290: 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61  one.** is left a
b2a0: 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  s is..**.** If a
b2b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
b2c0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
b2d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
b2e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
b2f0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
b300: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
b310: 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
b320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b330: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
b340: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
b350: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
b360: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
b370: 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
b380: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
b390: 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
b3a0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
b3b0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
b3c0: 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
b3d0: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
b3e0: 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
b3f0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
b400: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
b410: 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61  Loop,    /* Upda
b420: 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c  te the .nOut val
b430: 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20  ue of this loop 
b440: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65  */.  int *pbDone
b450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
b460: 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c   to true if at l
b470: 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76  east one expr. v
b480: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 2a  alue extracted *
b490: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
b4a0: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
b4b0: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
b4c0: 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
b4d0: 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74  ree.nEq;.  sqlit
b4e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b4f0: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65  >db;.  int nLowe
b500: 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55  r = -1;.  int nU
b510: 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c  pper = p->nSampl
b520: 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e+1;.  int rc = 
b530: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
b540: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  aff = sqlite3Ind
b550: 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  exColumnAffinity
b560: 28 64 62 2c 20 70 2c 20 6e 45 71 29 3b 0a 20 20  (db, p, nEq);.  
b570: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b580: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
b590: 75 65 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  ue *p1 = 0;     
b5a0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b5b0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
b5c0: 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  wer */.  sqlite3
b5d0: 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20 30 3b 20  _value *p2 = 0; 
b5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
b5f0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b600: 20 70 55 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c   pUpper */.  sql
b610: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
b620: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
b630: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b640: 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a 2f 0a 0a  from record */..
b650: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
b660: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
b670: 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c  Parse, p->azColl
b680: 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28 20 70 4c  [nEq]);.  if( pL
b690: 6f 77 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ower ){.    rc =
b6a0: 20 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c   sqlite3Stat4Val
b6b0: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
b6c0: 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72  e, pLower->pExpr
b6d0: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26  ->pRight, aff, &
b6e0: 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77 65 72 20  p1);.    nLower 
b6f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
b700: 55 70 70 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Upper && rc==SQL
b710: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
b720: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 56   = sqlite3Stat4V
b730: 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
b740: 72 73 65 2c 20 70 55 70 70 65 72 2d 3e 70 45 78  rse, pUpper->pEx
b750: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 2c  pr->pRight, aff,
b760: 20 26 70 32 29 3b 0a 20 20 20 20 6e 55 70 70 65   &p2);.    nUppe
b770: 72 20 3d 20 70 32 20 3f 20 30 20 3a 20 70 2d 3e  r = p2 ? 0 : p->
b780: 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20  nSample;.  }..  
b790: 69 66 28 20 70 31 20 7c 7c 20 70 32 20 29 7b 0a  if( p1 || p2 ){.
b7a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
b7b0: 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20 20 66 6f  nt nDiff;.    fo
b7c0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
b7d0: 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 53 61  E_OK && i<p->nSa
b7e0: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
b7f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b800: 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d  at4Column(db, p-
b810: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70  >aSample[i].p, p
b820: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  ->aSample[i].n, 
b830: 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20  nEq, &pVal);.   
b840: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b850: 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b 0a 20 20  E_OK && p1 ){.  
b860: 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
b870: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
b880: 65 28 70 31 2c 20 70 56 61 6c 2c 20 70 43 6f 6c  e(p1, pVal, pCol
b890: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
b8a0: 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77 65 72 2b  res>=0 ) nLower+
b8b0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
b8c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b8d0: 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20  OK && p2 ){.    
b8e0: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71      int res = sq
b8f0: 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
b900: 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29  p2, pVal, pColl)
b910: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
b920: 73 3e 3d 30 20 29 20 6e 55 70 70 65 72 2b 2b 3b  s>=0 ) nUpper++;
b930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b940: 20 20 20 6e 44 69 66 66 20 3d 20 28 6e 55 70 70     nDiff = (nUpp
b950: 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b 0a 20 20  er - nLower);.  
b960: 20 20 69 66 28 20 6e 44 69 66 66 3c 3d 30 20 29    if( nDiff<=0 )
b970: 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a 20 20 20   nDiff = 1;..   
b980: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
b990: 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e  both an upper an
b9a0: 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 73 70  d lower bound sp
b9b0: 65 63 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65  ecified, and the
b9c0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69   .    ** compari
b9d0: 73 6f 6e 73 20 69 6e 64 69 63 61 74 65 20 74 68  sons indicate th
b9e0: 61 74 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  at they are clos
b9f0: 65 20 74 6f 67 65 74 68 65 72 2c 20 75 73 65 20  e together, use 
ba00: 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a 20 20 20  the fallback.   
ba10: 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61 73 73 75   ** method (assu
ba20: 6d 65 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  me that the scan
ba30: 20 76 69 73 69 74 73 20 31 2f 36 34 20 6f 66 20   visits 1/64 of 
ba40: 74 68 65 20 72 6f 77 73 29 20 66 6f 72 20 65 73  the rows) for es
ba50: 74 69 6d 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  timating.    ** 
ba60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
ba70: 77 73 20 76 69 73 69 74 65 64 2e 20 4f 74 68 65  ws visited. Othe
ba80: 72 77 69 73 65 2c 20 65 73 74 69 6d 61 74 65 20  rwise, estimate 
ba90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
baa0: 77 73 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  ws.    ** using 
bab0: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
bac0: 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ibed in the head
bad0: 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74  er comment for t
bae0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
baf0: 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 21 3d  .    if( nDiff!=
bb00: 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d 30 20 7c  1 || pUpper==0 |
bb10: 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29 7b 0a 20  | pLower==0 ){. 
bb20: 20 20 20 20 20 69 6e 74 20 6e 41 64 6a 75 73 74       int nAdjust
bb30: 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f 67 45 73   = (sqlite3LogEs
bb40: 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29 20 2d 20  t(p->nSample) - 
bb50: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 44  sqlite3LogEst(nD
bb60: 69 66 66 29 29 3b 0a 20 20 20 20 20 20 70 4c 6f  iff));.      pLo
bb70: 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a  op->nOut -= nAdj
bb80: 75 73 74 3b 0a 20 20 20 20 20 20 2a 70 62 44 6f  ust;.      *pbDo
bb90: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48  ne = 1;.      WH
bba0: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
bbb0: 22 72 61 6e 67 65 20 73 6b 69 70 2d 73 63 61 6e  "range skip-scan
bbc0: 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75   regions: %u..%u
bbd0: 20 20 61 64 6a 75 73 74 3d 25 64 20 65 73 74 3d    adjust=%d est=
bbe0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70 70 65 72    nLower, nUpper
bc10: 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c 20 70 4c  , nAdjust*-1, pL
bc20: 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20  oop->nOut));.   
bc30: 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
bc40: 20 61 73 73 65 72 74 28 20 2a 70 62 44 6f 6e 65   assert( *pbDone
bc50: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ==0 );.  }..  sq
bc60: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
bc70: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  1);.  sqlite3Val
bc80: 75 65 46 72 65 65 28 70 32 29 3b 0a 20 20 73 71  ueFree(p2);.  sq
bc90: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
bca0: 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
bcb0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
bcc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
bcd0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
bce0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
bcf0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
bd00: 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
bd10: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
bd20: 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64   will be visited
bd30: 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .** by scanning 
bd40: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72  an index for a r
bd50: 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20  ange of values. 
bd60: 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61  The range may ha
bd70: 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62  ve an upper.** b
bd80: 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f  ound, a lower bo
bd90: 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68  und, or both. Th
bda0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
bdb0: 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68  erms that set th
bdc0: 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c  e upper.** and l
bdd0: 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20  ower bounds are 
bde0: 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70  represented by p
bdf0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
be00: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46   respectively. F
be10: 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61  or.** example, a
be20: 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64  ssuming that ind
be30: 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29  ex p is on t1(a)
be40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
be50: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
be60: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
be70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
be80: 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20        |_____|   
be90: 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20  |_____|.**      
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20   |         |.** 
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55      pLower    pU
bee0: 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  pper.**.** If ei
bef0: 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65  ther of the uppe
bf00: 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64  r or lower bound
bf10: 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
bf20: 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61   then NULL is pa
bf30: 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65  ssed in.** place
bf40: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
bf50: 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e  nding WhereTerm.
bf60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
bf70: 20 69 6e 20 28 70 42 75 69 6c 64 65 72 2d 3e 70   in (pBuilder->p
bf80: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
bf90: 29 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ) is the number 
bfa0: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  of the index.** 
bfb0: 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
bfc0: 6f 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  o the range cons
bfd0: 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
bfe0: 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
bff0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71 75 61 6c  mber of.** equal
c000: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
c010: 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
c020: 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
c030: 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
c040: 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 69  e,.** assuming i
c050: 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
c060: 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
c070: 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
c080: 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
c090: 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
c0a0: 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
c0b0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
c0c0: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 31 20  nEq is set to 1 
c0d0: 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
c0e0: 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
c0f0: 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
c100: 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  d .** left-most 
c110: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
c120: 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
c130: 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
c140: 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
c150: 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
c160: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
c170: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
c180: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  o 0..**.** When 
c190: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
c1a0: 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f 75 74 20   called, *pnOut 
c1b0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 71  is set to the sq
c1c0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 29 20 6f 66  lite3LogEst() of
c1d0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
c1e0: 66 20 72 6f 77 73 20 74 68 61 74 20 74 68 65 20  f rows that the 
c1f0: 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 65 78  index scan is ex
c200: 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 20  pected to visit 
c210: 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73  without .** cons
c220: 69 64 65 72 69 6e 67 20 74 68 65 20 72 61 6e 67  idering the rang
c230: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49  e constraints. I
c240: 66 20 6e 45 71 20 69 73 20 30 2c 20 74 68 65 6e  f nEq is 0, then
c250: 20 2a 70 6e 4f 75 74 20 69 73 20 74 68 65 20 6e   *pnOut is the n
c260: 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 72 6f 77  umber of .** row
c270: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20  s in the index. 
c280: 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
c290: 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e 4f 75 74  r occurs, *pnOut
c2a0: 20 69 73 20 61 64 6a 75 73 74 65 64 20 28 72 65   is adjusted (re
c2b0: 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20 61 63 63  duced).** to acc
c2c0: 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72 61 6e  ount for the ran
c2d0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 70  ge constraints p
c2e0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
c2f0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74 68 65 20  ..** .** In the 
c300: 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74  absence of sqlit
c310: 65 5f 73 74 61 74 34 20 41 4e 41 4c 59 5a 45 20  e_stat4 ANALYZE 
c320: 64 61 74 61 2c 20 6f 72 20 69 66 20 73 75 63 68  data, or if such
c330: 20 64 61 74 61 20 63 61 6e 6e 6f 74 20 62 65 0a   data cannot be.
c340: 2a 2a 20 75 73 65 64 2c 20 61 20 73 69 6e 67 6c  ** used, a singl
c350: 65 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69  e range inequali
c360: 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ty reduces the s
c370: 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
c380: 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a   factor of 4. .*
c390: 2a 20 61 6e 64 20 61 20 70 61 69 72 20 6f 66 20  * and a pair of 
c3a0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f  constraints (x>?
c3b0: 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65   AND x<?) reduce
c3c0: 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e  s the expected n
c3d0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73  umber of.** rows
c3e0: 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66 61   visited by a fa
c3f0: 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73  ctor of 64..*/.s
c400: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
c410: 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
c420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c430: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
c440: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
c450: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
c460: 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
c470: 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65 72  pBuilder,.  Wher
c480: 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
c490: 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
c4a0: 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
c4b0: 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
c4c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
c4d0: 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
c4e0: 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
c4f0: 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
c500: 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
c510: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
c520: 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20  ereLoop *pLoop  
c530: 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65     /* Modify the
c540: 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62 65   .nOut and maybe
c550: 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a 2f   .rRun fields */
c560: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
c570: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c580: 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f  nOut = pLoop->nO
c590: 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e 65  ut;.  LogEst nNe
c5a0: 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w;..#ifdef SQLIT
c5b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
c5c0: 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78 20  R_STAT4.  Index 
c5d0: 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  *p = pLoop->u.bt
c5e0: 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
c5f0: 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
c600: 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20 69  .btree.nEq;..  i
c610: 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  f( p->nSample>0 
c620: 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c  && nEq<p->nSampl
c630: 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  eCol ){.    if( 
c640: 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72 2d 3e 6e  nEq==pBuilder->n
c650: 52 65 63 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  RecValid ){.    
c660: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
c670: 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65   *pRec = pBuilde
c680: 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20 20 20 74  r->pRec;.      t
c690: 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
c6a0: 20 20 20 69 6e 74 20 6e 42 74 6d 20 3d 20 70 4c     int nBtm = pL
c6b0: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  oop->u.btree.nBt
c6c0: 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  m;.      int nTo
c6d0: 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  p = pLoop->u.btr
c6e0: 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20 20 20 20 20  ee.nTop;..      
c6f0: 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
c700: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
c710: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
c720: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
c730: 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 20 20 2a  rows in .      *
c740: 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  * the index that
c750: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74   are less than t
c760: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
c770: 66 20 74 68 65 20 72 61 6e 67 65 20 71 75 65 72  f the range quer
c780: 79 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  y. The.      ** 
c790: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 62 65 69 6e  lower bound bein
c7a0: 67 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  g the concatenat
c7b0: 69 6f 6e 20 6f 66 20 24 50 20 61 6e 64 20 24 4c  ion of $P and $L
c7c0: 2c 20 77 68 65 72 65 20 24 50 20 69 73 20 74 68  , where $P is th
c7d0: 65 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 2d 70  e.      ** key-p
c7e0: 72 65 66 69 78 20 66 6f 72 6d 65 64 20 62 79 20  refix formed by 
c7f0: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 6d  the nEq values m
c800: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 74  atched against t
c810: 68 65 20 6e 45 71 20 6c 65 66 74 2d 6d 6f 73 74  he nEq left-most
c820: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
c830: 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
c840: 61 6e 64 20 24 4c 20 69 73 20 74 68 65 20 76 61  and $L is the va
c850: 6c 75 65 20 69 6e 20 70 4c 6f 77 65 72 2e 0a 20  lue in pLower.. 
c860: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c870: 20 4f 72 2c 20 69 66 20 70 4c 6f 77 65 72 20 69   Or, if pLower i
c880: 73 20 4e 55 4c 4c 20 6f 72 20 24 4c 20 63 61 6e  s NULL or $L can
c890: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
c8a0: 20 66 72 6f 6d 20 69 74 20 28 62 65 63 61 75 73   from it (becaus
c8b0: 65 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  e it.      ** is
c8c0: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 76 61   not a simple va
c8d0: 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65 72 61  riable or litera
c8e0: 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20 6c 6f  l value), the lo
c8f0: 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  wer bound of the
c900: 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
c910: 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
c920: 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
c930: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c940: 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
c950: 20 20 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61     ** if $L is a
c960: 76 61 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b  vailable, whereK
c970: 65 79 53 74 61 74 73 28 29 20 69 73 20 63 61 6c  eyStats() is cal
c980: 6c 65 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50  led for both ($P
c990: 29 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  ) and .      ** 
c9a0: 28 24 50 3a 24 4c 29 20 61 6e 64 20 74 68 65 20  ($P:$L) and the 
c9b0: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 74 77  larger of the tw
c9c0: 6f 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  o returned value
c9d0: 73 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  s is used..     
c9e0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 69 6d   **.      ** Sim
c9f0: 69 6c 61 72 6c 79 2c 20 69 55 70 70 65 72 20 69  ilarly, iUpper i
ca00: 73 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74  s to be set to t
ca10: 68 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  he estimate of t
ca20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
ca30: 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20  s.      ** less 
ca40: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
ca50: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
ca60: 65 20 71 75 65 72 79 2e 20 57 68 65 72 65 20 74  e query. Where t
ca70: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  he upper bound. 
ca80: 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
ca90: 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24 55  r ($P) or ($P:$U
caa0: 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20 69  ). Again, even i
cab0: 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62 6c  f $U is availabl
cac0: 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  e, both values. 
cad0: 20 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65       ** of iUppe
cae0: 72 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20  r are requested 
caf0: 6f 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  of whereKeyStats
cb00: 28 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c  () and the small
cb10: 65 72 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  er used..      *
cb20: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  *.      ** The n
cb30: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62 65  umber of rows be
cb40: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 62 6f  tween the two bo
cb50: 75 6e 64 73 20 69 73 20 74 68 65 6e 20 6a 75 73  unds is then jus
cb60: 74 20 69 55 70 70 65 72 2d 69 4c 6f 77 65 72 2e  t iUpper-iLower.
cb70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cb80: 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 3b 20  tRowcnt iLower; 
cb90: 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73      /* Rows less
cba0: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
cbb0: 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 74  bound */.      t
cbc0: 52 6f 77 63 6e 74 20 69 55 70 70 65 72 3b 20 20  Rowcnt iUpper;  
cbd0: 20 20 20 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20     /* Rows less 
cbe0: 74 68 61 6e 20 74 68 65 20 75 70 70 65 72 20 62  than the upper b
cbf0: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
cc00: 74 20 69 4c 77 72 49 64 78 20 3d 20 2d 32 3b 20  t iLwrIdx = -2; 
cc10: 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66    /* aSample[] f
cc20: 6f 72 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  or the lower bou
cc30: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
cc40: 69 55 70 72 49 64 78 20 3d 20 2d 31 3b 20 20 20  iUprIdx = -1;   
cc50: 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72  /* aSample[] for
cc60: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
cc70: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70   */..      if( p
cc80: 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rec ){.        t
cc90: 65 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e  estcase( pRec->n
cca0: 46 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d  Field!=pBuilder-
ccb0: 3e 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  >nRecValid );.  
ccc0: 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65        pRec->nFie
ccd0: 6c 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  ld = pBuilder->n
cce0: 52 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  RecValid;.      
ccf0: 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  }.      /* Deter
cd00: 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20  mine iLower and 
cd10: 69 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50  iUpper using ($P
cd20: 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  ) only. */.     
cd30: 20 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20   if( nEq==0 ){. 
cd40: 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
cd50: 30 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  0;.        iUppe
cd60: 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b  r = p->nRowEst0;
cd70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cd80: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74        /* Note: t
cd90: 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62  his call could b
cda0: 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79  e optimized away
cdb0: 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d   - since the sam
cdc0: 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20  e values must . 
cdd0: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62         ** have b
cde0: 65 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68  een requested wh
cdf0: 65 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24  en testing key $
ce00: 50 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53  P in whereEqualS
ce10: 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20  canEst().  */.  
ce20: 20 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74        whereKeySt
ce30: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
ce40: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
ce50: 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30      iLower = a[0
ce60: 5d 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ];.        iUppe
ce70: 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b  r = a[0] + a[1];
ce80: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ce90: 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d  assert( pLower==
cea0: 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  0 || (pLower->eO
ceb0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
cec0: 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20  |WO_GE))!=0 );. 
ced0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70       assert( pUp
cee0: 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65  per==0 || (pUppe
cef0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
cf00: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30  WO_LT|WO_LE))!=0
cf10: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
cf20: 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  ( p->aSortOrder!
cf30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
cf40: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  p->aSortOrder[nE
cf50: 71 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  q] ){.        /*
cf60: 20 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c   The roles of pL
cf70: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
cf80: 61 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20  are swapped for 
cf90: 61 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a  a DESC index */.
cfa0: 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65          SWAP(Whe
cfb0: 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c  reTerm*, pLower,
cfc0: 20 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20   pUpper);.      
cfd0: 20 20 53 57 41 50 28 69 6e 74 2c 20 6e 42 74 6d    SWAP(int, nBtm
cfe0: 2c 20 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 7d  , nTop);.      }
cff0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
d000: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
d010: 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
d020: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
d030: 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
d040: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
d050: 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20       int n;     
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d070: 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61 63 74  * Values extract
d080: 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
d090: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
d0a0: 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70  Expr = pLower->p
d0b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
d0c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d0d0: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
d0e0: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
d0f0: 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 42  &pRec, pExpr, nB
d100: 74 6d 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20  tm, nEq, &n);.  
d110: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
d120: 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a  LITE_OK && n ){.
d130: 20 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e            tRowcn
d140: 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  t iNew;.        
d150: 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f    u16 mask = WO_
d160: 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20  GT|WO_LE;.      
d170: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
d180: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
d190: 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20  xpr)>n ) mask = 
d1a0: 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20  (WO_LE|WO_LT);. 
d1b0: 20 20 20 20 20 20 20 20 20 69 4c 77 72 49 64 78           iLwrIdx
d1c0: 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
d1d0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
d1e0: 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20  , 0, a);.       
d1f0: 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b     iNew = a[0] +
d200: 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72   ((pLower->eOper
d210: 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61  ator & mask) ? a
d220: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
d230: 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c 6f      if( iNew>iLo
d240: 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
d250: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
d260: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
d270: 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   pLower = 0;.   
d280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
d290: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73        /* If poss
d2a0: 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e  ible, improve on
d2b0: 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74 69   the iUpper esti
d2c0: 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24  mate using ($P:$
d2d0: 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  U). */.      if(
d2e0: 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20   pUpper ){.     
d2f0: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d310: 56 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64  Values extracted
d320: 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20   from pExpr */. 
d330: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
d340: 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
d350: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
d360: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d370: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
d380: 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
d390: 52 65 63 2c 20 70 45 78 70 72 2c 20 6e 54 6f 70  Rec, pExpr, nTop
d3a0: 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20  , nEq, &n);.    
d3b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d3c0: 54 45 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20  TE_OK && n ){.  
d3d0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
d3e0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d3f0: 75 31 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54  u16 mask = WO_GT
d400: 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  |WO_LE;.        
d410: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
d420: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
d430: 72 29 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57  r)>n ) mask = (W
d440: 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20  O_LE|WO_LT);.   
d450: 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20 3d         iUprIdx =
d460: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
d470: 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
d480: 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  1, a);.         
d490: 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
d4a0: 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
d4b0: 6f 72 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31  or & mask) ? a[1
d4c0: 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ] : 0);.        
d4d0: 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70 65    if( iNew<iUppe
d4e0: 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e 65  r ) iUpper = iNe
d4f0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  w;.          nOu
d500: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t--;.          p
d510: 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Upper = 0;.     
d520: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
d530: 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52      pBuilder->pR
d540: 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20 20  ec = pRec;.     
d550: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d560: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
d570: 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72 20  ( iUpper>iLower 
d580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  ){.          nNe
d590: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
d5a0: 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  t(iUpper - iLowe
d5b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  r);.          /*
d5c0: 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74   TUNING:  If bot
d5d0: 68 20 69 55 70 70 65 72 20 61 6e 64 20 69 4c 6f  h iUpper and iLo
d5e0: 77 65 72 20 61 72 65 20 64 65 72 69 76 65 64 20  wer are derived 
d5f0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20 20  from the same.  
d600: 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c          ** sampl
d610: 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74  e, then assume t
d620: 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72 65 20  hey are 4x more 
d630: 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68 69 73  selective.  This
d640: 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20 20 20   brings.        
d650: 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d 61 74    ** the estimat
d660: 65 64 20 73 65 6c 65 63 74 69 76 69 74 79 20 6d  ed selectivity m
d670: 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69 74 68  ore in line with
d680: 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64 20 62   what it would b
d690: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
d6a0: 66 20 65 73 74 69 6d 61 74 65 64 20 77 69 74 68  f estimated with
d6b0: 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66 20 53  out the use of S
d6c0: 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e 20 2a  TAT3/4 tables. *
d6d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
d6e0: 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49 64 78  iLwrIdx==iUprIdx
d6f0: 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20   ) nNew -= 20;  
d700: 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c 69  assert( 20==sqli
d710: 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a  te3LogEst(4) );.
d720: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d730: 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
d740: 31 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  10;        asser
d750: 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
d760: 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20  gEst(2) );.     
d770: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d780: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20   nNew<nOut ){.  
d790: 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e          nOut = n
d7a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
d7b0: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
d7c0: 45 28 30 78 31 30 2c 20 28 22 53 54 41 54 34 20  E(0x10, ("STAT4 
d7d0: 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e  range scan: %u..
d7e0: 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  %u  est=%d\n",. 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29 69            (u32)i
d810: 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55 70 70  Lower, (u32)iUpp
d820: 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20  er, nOut));.    
d830: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
d840: 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d       int bDone =
d850: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
d860: 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
d870: 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 4c 6f  nEst(pParse, pLo
d880: 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f  wer, pUpper, pLo
d890: 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20  op, &bDone);.   
d8a0: 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29 20 72     if( bDone ) r
d8b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d8c0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
d8d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
d8e0: 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rse);.  UNUSED_P
d8f0: 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c 64 65  ARAMETER(pBuilde
d900: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  r);.  assert( pL
d910: 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
d920: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
d930: 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  t( pUpper==0 || 
d940: 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61 67 73  (pUpper->wtFlags
d950: 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
d960: 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68  0 );.  nNew = wh
d970: 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70  ereRangeAdjust(p
d980: 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20  Lower, nOut);.  
d990: 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67  nNew = whereRang
d9a0: 65 41 64 6a 75 73 74 28 70 55 70 70 65 72 2c 20  eAdjust(pUpper, 
d9b0: 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e  nNew);..  /* TUN
d9c0: 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
d9d0: 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61   both an upper a
d9e0: 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 61  nd lower limit a
d9f0: 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d 69 74  nd neither limit
da00: 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61 70 70  .  ** has an app
da10: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
da20: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 20 61   likelihood(), a
da30: 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67 65 20  ssume the range 
da40: 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65 64 20  is.  ** reduced 
da50: 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  by an additional
da60: 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61 6e 73   75%. This means
da70: 20 74 68 61 74 2c 20 62 79 20 64 65 66 61 75 6c   that, by defaul
da80: 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64  t, an open-ended
da90: 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75 65 72  .  ** range quer
daa0: 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29  y (e.g. col > ?)
dab0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 6d   is assumed to m
dac0: 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68 65 20  atch 1/4 of the 
dad0: 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  rows in the.  **
dae0: 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20 61 20   index. While a 
daf0: 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28 65 2e  closed range (e.
db00: 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f  g. col BETWEEN ?
db10: 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74 69 6d   AND ?) is estim
db20: 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74  ated to.  ** mat
db30: 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65 20 69  ch 1/64 of the i
db40: 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20  ndex. */ .  if( 
db50: 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77 65 72  pLower && pLower
db60: 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 26 26  ->truthProb>0 &&
db70: 20 70 55 70 70 65 72 20 26 26 20 70 55 70 70 65   pUpper && pUppe
db80: 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20 29  r->truthProb>0 )
db90: 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30  {.    nNew -= 20
dba0: 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d  ;.  }..  nOut -=
dbb0: 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28   (pLower!=0) + (
dbc0: 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69 66  pUpper!=0);.  if
dbd0: 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77  ( nNew<10 ) nNew
dbe0: 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65   = 10;.  if( nNe
dbf0: 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20  w<nOut ) nOut = 
dc00: 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e 65  nNew;.#if define
dc10: 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
dc20: 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f  BLED).  if( pLoo
dc30: 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a  p->nOut>nOut ){.
dc40: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
dc50: 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61 6e  x10,("Range scan
dc60: 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72 6f   lowers nOut fro
dc70: 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20  m %d to %d\n",. 
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20     pLoop->nOut, 
dca0: 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  nOut));.  }.#end
dcb0: 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  if.  pLoop->nOut
dcc0: 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b   = (LogEst)nOut;
dcd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
dce0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
dcf0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
dd00: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
dd10: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
dd20: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
dd30: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
dd40: 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
dd50: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
dd60: 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
dd70: 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
dd80: 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
dd90: 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
dda0: 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
ddb0: 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
ddc0: 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
ddd0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
dde0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
ddf0: 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
de00: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
de10: 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
de20: 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
de30: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
de40: 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
de50: 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
de60: 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
de70: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
de80: 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
de90: 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
dea0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
deb0: 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
dec0: 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
ded0: 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
dee0: 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
def0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
df00: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
df10: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
df20: 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
df30: 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
df40: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
df50: 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
df60: 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
df70: 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
df80: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
df90: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
dfa0: 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
dfb0: 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
dfc0: 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
dfd0: 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
dfe0: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
dff0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
e000: 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
e010: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
e020: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
e030: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
e040: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
e050: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
e060: 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
e070: 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78  der,.  Expr *pEx
e080: 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
e090: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
e0a0: 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
e0b0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
e0c0: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f  .  tRowcnt *pnRo
e0d0: 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  w       /* Write
e0e0: 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
e0f0: 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
e100: 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
e110: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
e120: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
e130: 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42  ;.  int nEq = pB
e140: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
e150: 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70  btree.nEq;.  Unp
e160: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65  ackedRecord *pRe
e170: 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  c = pBuilder->pR
e180: 65 63 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  ec;.  int rc;   
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
e1b0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
e1c0: 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20  tRowcnt a[2];   
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
e1e0: 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  tistics */.  int
e1f0: 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28   bOk;..  assert(
e200: 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73   nEq>=1 );.  ass
e210: 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f  ert( nEq<=p->nCo
e220: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
e230: 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
e240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e250: 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
e260: 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d  ssert( pBuilder-
e270: 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29  >nRecValid<nEq )
e280: 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65  ;..  /* If value
e290: 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
e2a0: 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c  ble for all fiel
e2b0: 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ds of the index 
e2c0: 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
e2d0: 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f   of this one, no
e2e0: 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65   estimate can be
e2f0: 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51   made. Return SQ
e300: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a  LITE_NOTFOUND. *
e310: 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
e320: 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71  ->nRecValid<(nEq
e330: 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
e340: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e350: 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
e360: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
e370: 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63  tion only. The c
e380: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74  all to sqlite3St
e390: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
e3a0: 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f  ().  ** below wo
e3b0: 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  uld return the s
e3c0: 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  ame value.  */. 
e3d0: 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f   if( nEq>=p->nCo
e3e0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52  lumn ){.    *pnR
e3f0: 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
e400: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e410: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
e420: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
e430: 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
e440: 70 52 65 63 2c 20 70 45 78 70 72 2c 20 31 2c 20  pRec, pExpr, 1, 
e450: 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
e460: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
e470: 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
e480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e490: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
e4a0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
e4b0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e4c0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e4d0: 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
e4e0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e4f0: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
e500: 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
e510: 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
e520: 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25  y scan regions %
e530: 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20  s(%d): %d\n",.  
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31   p->zName, nEq-1
e560: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
e570: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
e580: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
e590: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e5a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e5b0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
e5c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e5d0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e5e0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e5f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
e600: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
e610: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
e620: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
e630: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
e640: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e650: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e660: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
e670: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
e680: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
e690: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
e6a0: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
e6b0: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
e6c0: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
e6d0: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
e6e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
e6f0: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
e700: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
e710: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
e720: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
e730: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
e740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e750: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
e760: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
e770: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
e780: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
e790: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
e7a0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
e7b0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
e7c0: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
e7d0: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
e7e0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
e7f0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
e800: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
e810: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
e820: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
e830: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
e840: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
e850: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e860: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e870: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e880: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e890: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e8a0: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
e8b0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
e8c0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
e8d0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
e8e0: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
e8f0: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
e900: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e910: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e920: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e930: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e940: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e950: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e960: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
e970: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
e980: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
e990: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
e9a0: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
e9b0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e9c0: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
e9d0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
e9e0: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
e9f0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
ea00: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
ea10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ea20: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
ea30: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
ea40: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
ea50: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
ea60: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
ea70: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
ea80: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ea90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
eaa0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
eab0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
eac0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
ead0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
eae0: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
eaf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
eb00: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
eb10: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
eb20: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
eb30: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
eb40: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
eb50: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
eb60: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
eb70: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
eb80: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
eb90: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
eba0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ebb0: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
ebc0: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
ebd0: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
ebe0: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
ebf0: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
ec00: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
ec10: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ec20: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ec30: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ec40: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
ec50: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ec60: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ec70: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ec80: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
ec90: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
eca0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
ecb0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ecc0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
ecd0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
ece0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
ecf0: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
ed00: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
ed10: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
ed20: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
ed30: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ed40: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
ed50: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
ed60: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
ed70: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68  zType[4];.    ch
ed80: 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20  ar zLeft[50];.  
ed90: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
eda0: 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
edb0: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
edc0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
edd0: 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
ede0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
edf0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ee00: 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
ee10: 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
ee20: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ee30: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
ee40: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
ee50: 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
ee60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ee70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
ee80: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GLE ){.      sql
ee90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
eea0: 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66  zeof(zLeft),zLef
eeb0: 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22  t,"left={%d:%d}"
eec0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eed0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
eee0: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
eef0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29  m->u.leftColumn)
ef00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ef10: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
ef20: 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26  r & WO_OR)!=0 &&
ef30: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
ef40: 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o!=0 ){.      sq
ef50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
ef60: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ef70: 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78  ft,"indexable=0x
ef80: 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20  %lld", .        
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
efa0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
efb0: 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20  >indexable);.   
efc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
efd0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
efe0: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
eff0: 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54  ft,"left=%d", pT
f000: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
f010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f020: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
f030: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
f040: 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70 72  d %p %s %-12s pr
f050: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
f060: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
f070: 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d 2c  ",.       iTerm,
f080: 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20 7a   pTerm, zType, z
f090: 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74 72 75  Left, pTerm->tru
f0a0: 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70  thProb,.       p
f0b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c  Term->eOperator,
f0c0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29   pTerm->wtFlags)
f0d0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
f0e0: 3e 69 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20  >iField ){.     
f0f0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
f100: 6e 74 66 28 22 20 69 46 69 65 6c 64 3d 25 64 5c  ntf(" iField=%d\
f110: 6e 22 2c 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c  n", pTerm->iFiel
f120: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
f130: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f140: 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
f150: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f160: 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
f170: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29  pTerm->pExpr, 0)
f180: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
f190: 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
f1a0: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
f1b0: 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74  Show the complet
f1c0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
f1d0: 68 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f  hereClause.*/.vo
f1e0: 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  id sqlite3WhereC
f1f0: 6c 61 75 73 65 50 72 69 6e 74 28 57 68 65 72 65  lausePrint(Where
f200: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
f210: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
f220: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
f230: 69 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54  i++){.    whereT
f240: 65 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61  ermPrint(&pWC->a
f250: 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23  [i], i);.  }.}.#
f260: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48  endif..#ifdef WH
f270: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
f280: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
f290: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
f2a0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
f2b0: 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
f2c0: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
f2d0: 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
f2e0: 70 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  p, WhereClause *
f2f0: 70 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  pWC){.  WhereInf
f300: 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
f310: 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e  >pWInfo;.  int n
f320: 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70  b = 1+(pWInfo->p
f330: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29  TabList->nSrc+3)
f340: 2f 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /4;.  struct Src
f350: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
f360: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
f370: 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62  ist->a + p->iTab
f380: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
f390: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
f3a0: 20 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20   Bitmask mAll = 
f3b0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
f3c0: 6e 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71  nb*4)) - 1;.  sq
f3d0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f3e0: 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
f3f0: 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
f420: 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
f430: 62 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d  b, p->prereq & m
f440: 41 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  All);.  sqlite3D
f450: 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32  ebugPrintf(" %12
f460: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
f470: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
f480: 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e  zAlias ? pItem->
f490: 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a  zAlias : pTab->z
f4a0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  Name);.  if( (p-
f4b0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
f4c0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
f4d0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
f4e0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
f4f0: 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  if( p->u.btree.p
f500: 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20  Index && (zName 
f510: 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
f520: 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  dex->zName)!=0 )
f530: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
f540: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
f550: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
f560: 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  17)==0 ){.      
f570: 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
f580: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
f590: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   - 1;.        wh
f5a0: 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ile( zName[i]!='
f5b0: 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  _' ) i--;.      
f5c0: 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20    zName += i;.  
f5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f5e0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f5f0: 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61  .%-16s %2d", zNa
f600: 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  me, p->u.btree.n
f610: 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Eq);.    }else{.
f620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
f630: 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c  ugPrintf("%20s",
f640: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  "");.    }.  }el
f650: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
f660: 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74  .    if( p->u.vt
f670: 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20  ab.idxStr ){.   
f680: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
f690: 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73  printf("(%d,\"%s
f6a0: 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20  \",%x)",.       
f6b0: 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74           p->u.vt
f6c0: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
f6d0: 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e  vtab.idxStr, p->
f6e0: 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29  u.vtab.omitMask)
f6f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f700: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
f710: 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22  printf("(%d,%x)"
f720: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  , p->u.vtab.idxN
f730: 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  um, p->u.vtab.om
f740: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20  itMask);.    }. 
f750: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f760: 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20  rintf(" %-19s", 
f770: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
f780: 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69  free(z);.  }.  i
f790: 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
f7a0: 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29  WHERE_SKIPSCAN )
f7b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
f7c0: 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35  ugPrintf(" f %05
f7d0: 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46  x %d-%d", p->wsF
f7e0: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c  lags, p->nLTerm,
f7f0: 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c  p->nSkip);.  }el
f800: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
f810: 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
f820: 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  05x N %d", p->ws
f830: 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
f840: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
f850: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
f860: 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
f870: 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
f880: 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20  un, p->nOut);.  
f890: 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
f8a0: 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
f8b0: 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
f8c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f8d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f8e0: 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nLTerm; i++){.  
f8f0: 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
f900: 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c  nt(p->aLTerm[i],
f910: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
f920: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
f930: 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
f940: 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
f950: 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
f960: 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
f970: 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
f980: 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
f990: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f9a0: 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
f9b0: 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
f9c0: 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
f9d0: 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
f9e0: 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
f9f0: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
fa00: 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
fa10: 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
fa20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
fa30: 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
fa40: 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
fa50: 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
fa60: 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
fa70: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
fa80: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
fa90: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
faa0: 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
fab0: 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
fac0: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
fad0: 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
fae0: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
faf0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
fb00: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
fb10: 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
fb20: 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
fb30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
fb40: 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
fb50: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
fb60: 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
fb70: 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
fb80: 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
fb90: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
fba0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
fbb0: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
fbc0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
fbd0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
fbe0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
fbf0: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
fc00: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
fc10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fc20: 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  db, p->u.btree.p
fc30: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
fc40: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
fc50: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
fc60: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
fc70: 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f  te internal memo
fc80: 72 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65  ry used by a Whe
fc90: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f  reLoop object.*/
fca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
fcb0: 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69  reLoopClear(sqli
fcc0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
fcd0: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
fce0: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
fcf0: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
fd00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
fd10: 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c  LTerm);.  whereL
fd20: 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
fd30: 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  , p);.  whereLoo
fd40: 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  pInit(p);.}../*.
fd50: 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
fd60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
fd70: 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54  n for pLoop->aLT
fd80: 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c  erm[] to be at l
fd90: 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69  east n..*/.stati
fda0: 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52  c int whereLoopR
fdb0: 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64  esize(sqlite3 *d
fdc0: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  b, WhereLoop *p,
fdd0: 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65   int n){.  Where
fde0: 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20  Term **paNew;.  
fdf0: 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e  if( p->nLSlot>=n
fe00: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
fe10: 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29  _OK;.  n = (n+7)
fe20: 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73  &~7;.  paNew = s
fe30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
fe40: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  wNN(db, sizeof(p
fe50: 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
fe60: 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
fe70: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fe80: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
fe90: 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61  mcpy(paNew, p->a
fea0: 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d  LTerm, sizeof(p-
feb0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e  >aLTerm[0])*p->n
fec0: 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d  LSlot);.  if( p-
fed0: 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65  >aLTerm!=p->aLTe
fee0: 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65  rmSpace ) sqlite
fef0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
ff00: 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54  LTerm);.  p->aLT
ff10: 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70  erm = paNew;.  p
ff20: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20  ->nLSlot = n;.  
ff30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ff40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
ff50: 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  fer content from
ff60: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f   the second pLoo
ff70: 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74  p into the first
ff80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ff90: 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71  whereLoopXfer(sq
ffa0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
ffb0: 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65  Loop *pTo, Where
ffc0: 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  Loop *pFrom){.  
ffd0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
ffe0: 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20  ion(db, pTo);.  
fff0: 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
10000 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72  ize(db, pTo, pFr
10010 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20  om->nLTerm) ){. 
10020 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e     memset(&pTo->
10030 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f  u, 0, sizeof(pTo
10040 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->u));.    retur
10050 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
10060 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  KPT;.  }.  memcp
10070 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48  y(pTo, pFrom, WH
10080 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a  ERE_LOOP_XFER_SZ
10090 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d  );.  memcpy(pTo-
100a0 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e  >aLTerm, pFrom->
100b0 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54  aLTerm, pTo->nLT
100c0 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e  erm*sizeof(pTo->
100d0 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69  aLTerm[0]));.  i
100e0 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67  f( pFrom->wsFlag
100f0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
10100 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46  LTABLE ){.    pF
10110 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  rom->u.vtab.need
10120 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
10130 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73  e if( (pFrom->ws
10140 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
10150 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  TO_INDEX)!=0 ){.
10160 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72      pFrom->u.btr
10170 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
10180 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
10190 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
101a0 44 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f  Delete a WhereLo
101b0 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
101c0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
101d0 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  opDelete(sqlite3
101e0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
101f0 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  *p){.  whereLoop
10200 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20  Clear(db, p);.  
10210 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10220 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
10230 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
10240 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
10250 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
10260 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
10270 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
10280 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
10290 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
102a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
102b0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
102c0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
102d0 20 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c        WhereLevel
102e0 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e   *pLevel = &pWIn
102f0 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  fo->a[i];.      
10300 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
10310 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
10320 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
10330 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10340 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10350 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
10360 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
10370 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
10380 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  }.    sqlite3Whe
10390 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
103a0 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20  WInfo->sWC);.   
103b0 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
103c0 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20  pLoops ){.      
103d0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
103e0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
103f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f       pWInfo->pLo
10400 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ops = p->pNextLo
10410 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
10420 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
10430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10440 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
10450 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Info);.  }.}../*
10460 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10470 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
10480 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
10490 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58  :.**.**   (1)  X
104a0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
104b0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74   lower cost that
104c0 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69   Y.**   (2)  X i
104d0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
104e0 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20  t of Y.**   (3) 
104f0 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73   X skips at leas
10500 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  t as many column
10510 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20  s as Y.**.** By 
10520 22 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20  "proper subset" 
10530 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75  we mean that X u
10540 73 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20  ses fewer WHERE 
10550 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20  clause terms.** 
10560 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20  than Y and that 
10570 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
10580 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20  se term used by 
10590 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a  X is also used.*
105a0 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  * by Y..**.** If
105b0 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73   X is a proper s
105c0 75 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20  ubset of Y then 
105d0 59 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68  Y is a better ch
105e0 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a  oice and ought.*
105f0 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65  * to have a lowe
10600 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f  r cost.  This ro
10610 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52  utine returns TR
10620 55 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73  UE when that cos
10630 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68  t .** relationsh
10640 69 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61  ip is inverted a
10650 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  nd needs to be a
10660 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68  djusted.  The th
10670 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20  ird rule.** was 
10680 61 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66  added because if
10690 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61   X uses skip-sca
106a0 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74  n less than Y it
106b0 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20   still might.** 
106c0 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20  deserve a lower 
106d0 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20  cost even if it 
106e0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
106f0 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74  et of Y..*/.stat
10700 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
10710 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
10720 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65  set(.  const Whe
10730 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20  reLoop *pX,     
10740 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65    /* First Where
10750 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20  Loop to compare 
10760 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  */.  const Where
10770 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20  Loop *pY        
10780 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e  /* Compare again
10790 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  st this WhereLoo
107a0 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  p */.){.  int i,
107b0 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c   j;.  if( pX->nL
107c0 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e  Term-pX->nSkip >
107d0 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d  = pY->nLTerm-pY-
107e0 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65  >nSkip ){.    re
107f0 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20  turn 0; /* X is 
10800 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20  not a subset of 
10810 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y */.  }.  if( p
10820 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e  Y->nSkip > pX->n
10830 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b  Skip ) return 0;
10840 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20  .  if( pX->rRun 
10850 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20  >= pY->rRun ){. 
10860 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20     if( pX->rRun 
10870 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74  > pY->rRun ) ret
10880 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63  urn 0;    /* X c
10890 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59  osts more than Y
108a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e   */.    if( pX->
108b0 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20  nOut > pY->nOut 
108c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f  ) return 0;    /
108d0 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  * X costs more t
108e0 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  han Y */.  }.  f
108f0 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d  or(i=pX->nLTerm-
10900 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
10910 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72     if( pX->aLTer
10920 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  m[i]==0 ) contin
10930 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59  ue;.    for(j=pY
10940 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
10950 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; j--){.      if
10960 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  ( pY->aLTerm[j]=
10970 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29  =pX->aLTerm[i] )
10980 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10990 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75    if( j<0 ) retu
109a0 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20  rn 0;  /* X not 
109b0 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69  a subset of Y si
109c0 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f  nce term X[i] no
109d0 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20  t used by Y */. 
109e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20   }.  return 1;  
109f0 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e  /* All condition
10a00 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  s meet */.}../*.
10a10 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74  ** Try to adjust
10a20 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65   the cost of Whe
10a30 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65  reLoop pTemplate
10a40 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e   upwards or down
10a50 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74  wards so.** that
10a60 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54  :.**.**   (1) pT
10a70 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65  emplate costs le
10a80 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65  ss than any othe
10a90 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61  r WhereLoops tha
10aa0 74 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a  t are a proper.*
10ab0 2a 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f  *       subset o
10ac0 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a  f pTemplate.**.*
10ad0 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74  *   (2) pTemplat
10ae0 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  e costs more tha
10af0 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
10b00 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68  eLoops for which
10b10 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20   pTemplate.**   
10b20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20      is a proper 
10b30 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  subset..**.** To
10b40 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20   say "WhereLoop 
10b50 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
10b60 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73  bset of Y" means
10b70 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77   that X uses few
10b80 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  er.** WHERE clau
10b90 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20  se terms than Y 
10ba0 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57  and that every W
10bb0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
10bc0 20 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a   used by X is.**
10bd0 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e   also used by Y.
10be0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10bf0 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43  whereLoopAdjustC
10c00 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c  ost(const WhereL
10c10 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f  oop *p, WhereLoo
10c20 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20  p *pTemplate){. 
10c30 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d   if( (pTemplate-
10c40 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
10c50 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72  _INDEXED)==0 ) r
10c60 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70  eturn;.  for(; p
10c70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
10c80 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
10c90 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69  ab!=pTemplate->i
10ca0 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Tab ) continue;.
10cb0 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c      if( (p->wsFl
10cc0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
10cd0 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  XED)==0 ) contin
10ce0 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72  ue;.    if( wher
10cf0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
10d00 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d  erSubset(p, pTem
10d10 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  plate) ){.      
10d20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
10d30 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72  ate cost downwar
10d40 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
10d50 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73  cheaper than its
10d60 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65   .      ** subse
10d70 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48  t p. */.      WH
10d80 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22  ERETRACE(0x80,("
10d90 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75  subset cost adju
10da0 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20  stment %d,%d to 
10db0 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d,%d\n",.      
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
10de0 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  , pTemplate->nOu
10df0 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  t, p->rRun, p->n
10e00 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70  Out-1));.      p
10e10 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d  Template->rRun =
10e20 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20   p->rRun;.      
10e30 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
10e40 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20  = p->nOut - 1;. 
10e50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65     }else if( whe
10e60 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
10e70 70 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c  perSubset(pTempl
10e80 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20  ate, p) ){.     
10e90 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70   /* Adjust pTemp
10ea0 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64  late cost upward
10eb0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
10ec0 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73  ostlier than p s
10ed0 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54  ince.      ** pT
10ee0 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f  emplate is a pro
10ef0 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20  per subset of p 
10f00 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
10f10 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
10f20 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
10f30 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
10f40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10f50 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
10f60 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
10f70 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
10f80 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31  >rRun, p->nOut+1
10f90 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
10fa0 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
10fb0 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
10fc0 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
10fd0 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  nOut + 1;.    }.
10fe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61    }.}../*.** Sea
10ff0 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rch the list of 
11000 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70  WhereLoops in *p
11010 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f  pPrev looking fo
11020 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62  r one that can b
11030 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20  e.** supplanted 
11040 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a  by pTemplate..**
11050 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
11060 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  if the WhereLoop
11070 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61   list contains a
11080 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e  n entry that can
11090 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65   supplant.** pTe
110a0 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72  mplate, in other
110b0 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c   words if pTempl
110c0 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c  ate does not bel
110d0 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e  ong on the list.
110e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20  .**.** If pX is 
110f0 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  a WhereLoop that
11100 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73   pTemplate can s
11110 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65  upplant, then re
11120 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b  turn the.** link
11130 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
11140 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65  pX..**.** If pTe
11150 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75  mplate cannot su
11160 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74  pplant any exist
11170 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
11180 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64  he list but need
11190 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64  s.** to be added
111a0 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68   to the list, th
111b0 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
111c0 74 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20  ter to the tail 
111d0 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  of the list..*/.
111e0 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70  static WhereLoop
111f0 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   **whereLoopFind
11200 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c  Lesser(.  WhereL
11210 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20  oop **ppPrev,.  
11220 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
11230 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20  *pTemplate.){.  
11240 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20  WhereLoop *p;.  
11250 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b  for(p=(*ppPrev);
11260 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70   p; ppPrev=&p->p
11270 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50  NextLoop, p=*ppP
11280 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  rev){.    if( p-
11290 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65  >iTab!=pTemplate
112a0 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f  ->iTab || p->iSo
112b0 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65  rtIdx!=pTemplate
112c0 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20  ->iSortIdx ){.  
112d0 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
112e0 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f   the iTab or iSo
112f0 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72  rtIdx values for
11300 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61   two WhereLoop a
11310 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  re different.   
11320 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65     ** then those
11330 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64   WhereLoops need
11340 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65   to be considere
11350 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e  d separately.  N
11360 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20  either is.      
11370 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  ** a candidate t
11380 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74  o replace the ot
11390 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f  her. */.      co
113a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
113b0 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72    /* In the curr
113c0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
113d0 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76  on, the rSetup v
113e0 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a  alue is either z
113f0 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68  ero.    ** or th
11400 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69  e cost of buildi
11410 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
11420 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e  index (NlogN) an
11430 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20  d the NlogN.    
11440 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66  ** is the same f
11450 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68  or compatible Wh
11460 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20  ereLoops. */.   
11470 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
11480 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61  up==0 || pTempla
11490 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20  te->rSetup==0 . 
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  || p->rSetup==pT
114c0 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20  emplate->rSetup 
114d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65  );..    /* where
114e0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61  LoopAddBtree() a
114f0 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20  lways generates 
11500 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20  and inserts the 
11510 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a  automatic index.
11520 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73      ** case firs
11530 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74  t.  Hence compat
11540 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57  ible candidate W
11550 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20  hereLoops never 
11560 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20  have a larger.  
11570 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c    ** rSetup. Cal
11580 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56  l this SETUP-INV
11590 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73  ARIANT */.    as
115a0 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
115b0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
115c0 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e  up );..    /* An
115d0 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20  y loop using an 
115e0 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e  appliation-defin
115f0 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49  ed index (or PRI
11600 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20  MARY KEY or.    
11610 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
11620 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f  aint) with one o
11630 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72  r more == constr
11640 61 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a  aints is better.
11650 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61      ** than an a
11660 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
11670 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73  Unless it is a s
11680 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  kip-scan. */.   
11690 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
116a0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
116b0 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20  DEX)!=0.     && 
116c0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69  (pTemplate->nSki
116d0 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  p)==0.     && (p
116e0 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
116f0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
11700 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  D)!=0.     && (p
11710 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
11720 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
11730 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _EQ)!=0.     && 
11740 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
11750 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
11760 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
11770 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  eq.    ){.      
11780 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11790 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67    /* If existing
117a0 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
117b0 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d  better than pTem
117c0 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65  plate, pTemplate
117d0 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64   can be.    ** d
117e0 69 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65  iscarded.  Where
117f0 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
11800 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31   if:.    **   (1
11810 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65  )  p has no more
11820 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
11830 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e  an pTemplate, an
11840 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
11850 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  p has an equal o
11860 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
11870 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20  n pTemplate.    
11880 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
11890 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
118a0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70  e->prereq)==p->p
118b0 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20  rereq    /* (1) 
118c0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
118d0 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65  Setup<=pTemplate
118e0 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20  ->rSetup        
118f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
11900 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
11910 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun<=pTemplate-
11920 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20  >rRun           
11930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11940 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  b) */.     && p-
11950 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65  >nOut<=pTemplate
11960 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
11970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
11980 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20  2c) */.    ){.  
11990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
119a0 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c  * Discard pTempl
119b0 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  ate */.    }..  
119c0 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74    /* If pTemplat
119d0 65 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74  e is always bett
119e0 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20  er than p, then 
119f0 63 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  cause p to be ov
11a00 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  erwritten.    **
11a10 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e   with pTemplate.
11a20 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62    pTemplate is b
11a30 65 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a  etter than p if:
11a40 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
11a50 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20  Template has no 
11a60 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73  more dependences
11a70 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20   than p, and.   
11a80 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70   **   (2)  pTemp
11a90 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61  late has an equa
11aa0 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  l or lower cost 
11ab0 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20  than p..    */. 
11ac0 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
11ad0 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
11ae0 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
11af0 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28  e->prereq   /* (
11b00 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  1)  */.     && p
11b10 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74  ->rRun>=pTemplat
11b20 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
11b50 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d      && p->nOut>=
11b60 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
11b90 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20  2b) */.    ){.  
11ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
11bb0 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
11bc0 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53  ->rSetup ); /* S
11bd0 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61  ETUP-INVARIANT a
11be0 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72  bove */.      br
11bf0 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20  eak;   /* Cause 
11c00 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
11c10 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65  ten by pTemplate
11c20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
11c30 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d  return ppPrev;.}
11c40 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f  ../*.** Insert o
11c50 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72  r replace a Wher
11c60 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e  eLoop entry usin
11c70 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73  g the template s
11c80 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  upplied..**.** A
11c90 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
11ca0 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74  Loop entry might
11cb0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
11cc0 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  if the new templ
11cd0 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72  ate.** is better
11ce0 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64   and has fewer d
11cf0 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72  ependencies.  Or
11d00 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69   the template wi
11d10 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a  ll be ignored.**
11d20 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77   and no insert w
11d30 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20  ill occur if an 
11d40 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11d50 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64  op is faster and
11d60 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65   has.** fewer de
11d70 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
11d80 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f  the template.  O
11d90 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57  therwise a new W
11da0 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61  hereLoop is.** a
11db0 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  dded based on th
11dc0 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a  e template..**.*
11dd0 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
11de0 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c  OrSet is not NUL
11df0 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61  L then we care a
11e00 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  bout only the.**
11e10 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
11e20 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74  nd rRun and nOut
11e30 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20   costs of the N 
11e40 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61  best loops.  Tha
11e50 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  t.** information
11e60 20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20   is gathered in 
11e70 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  the pBuilder->pO
11e80 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  rSet object.  Th
11e90 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72  is special.** pr
11ea0 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73  ocessing mode is
11eb0 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f   used only for O
11ec0 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
11ed0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ing..**.** When 
11ee0 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c  accumulating mul
11ef0 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65  tiple loops (whe
11f00 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  n pBuilder->pOrS
11f10 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a  et is NULL) we.*
11f20 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76  * still might ov
11f30 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20  erwrite similar 
11f40 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e  loops with the n
11f50 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74  ew template if t
11f60 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61  he.** new templa
11f70 74 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c  te is better.  L
11f80 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72  oops may be over
11f90 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66  written if the f
11fa0 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e  ollowing .** con
11fb0 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a  ditions are met:
11fc0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
11fd0 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
11fe0 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32  e iTab..**    (2
11ff0 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
12000 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a   same iSortIdx..
12010 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74  **    (3)  The t
12020 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65  emplate has same
12030 20 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64   or fewer depend
12040 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
12050 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20  current loop.** 
12060 20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70     (4)  The temp
12070 6c 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d  late has the sam
12080 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  e or lower cost 
12090 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
120a0 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20   loop.*/.static 
120b0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  int whereLoopIns
120c0 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  ert(WhereLoopBui
120d0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
120e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
120f0 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f  late){.  WhereLo
12100 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b  op **ppPrev, *p;
12110 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
12120 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
12130 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  >pWInfo;.  sqlit
12140 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
12150 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
12160 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  nt rc;..  /* If 
12170 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12180 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
12190 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
121a0 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
121b0 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
121c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
121d0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
121e0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
121f0 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a  late->nLTerm ){.
12200 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12210 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36  NABLED.      u16
12220 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70   n = pBuilder->p
12230 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20  OrSet->n;.      
12240 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20  int x =.#endif. 
12250 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
12260 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  rt(pBuilder->pOr
12270 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  Set, pTemplate->
12280 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74  prereq, pTemplat
12290 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20  e->rRun,.       
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
122c0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23  mplate->nOut);.#
122d0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
122e0 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
122f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12300 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
12310 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
12320 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12330 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a  x?"   or-%d:  ":
12340 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29  "   or-X:  ", n)
12350 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
12360 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
12370 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  te, pBuilder->pW
12380 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
12390 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  if.    }.    ret
123a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
123b0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f   }..  /* Look fo
123c0 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  r an existing Wh
123d0 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61  ereLoop to repla
123e0 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ce with pTemplat
123f0 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f  e.  */.  whereLo
12400 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49  opAdjustCost(pWI
12410 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
12420 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65  mplate);.  ppPre
12430 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e  v = whereLoopFin
12440 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d  dLesser(&pWInfo-
12450 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
12460 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72  te);..  if( ppPr
12470 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ev==0 ){.    /* 
12480 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  There already ex
12490 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70  ists a WhereLoop
124a0 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61   on the list tha
124b0 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  t is better.    
124c0 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  ** than pTemplat
124d0 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72  e, so just ignor
124e0 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23  e pTemplate */.#
124f0 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
12500 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
12510 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
12520 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
12530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12540 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20  DebugPrintf("   
12550 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20  skip: ");.      
12560 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12570 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
12580 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
12590 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
125a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20  n SQLITE_OK;  . 
125b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
125c0 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20  *ppPrev;.  }..  
125d0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
125e0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61  his point it mea
125f0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70  ns that either p
12600 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65  [] should be ove
12610 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69  rwritten.  ** wi
12620 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69  th pTemplate[] i
12630 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72  f p[] exists, or
12640 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e   if p==NULL then
12650 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a   allocate a new.
12660 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61    ** WhereLoop a
12670 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20  nd insert it..  
12680 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
12690 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
126a0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
126b0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
126c0 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  8 ){.    if( p!=
126d0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
126e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72  e3DebugPrintf("r
126f0 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20  eplace: ");.    
12700 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12710 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  (p, pBuilder->pW
12720 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  C);.    }.    sq
12730 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12740 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
12750 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
12760 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
12770 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
12780 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d  .#endif.  if( p=
12790 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =0 ){.    /* All
127a0 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
127b0 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20  eLoop to add to 
127c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
127d0 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72  ist */.    *ppPr
127e0 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33  ev = p = sqlite3
127f0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
12800 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
12810 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  op));.    if( p=
12820 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12830 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12840 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74     whereLoopInit
12850 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  (p);.    p->pNex
12860 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLoop = 0;.  }el
12870 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69  se{.    /* We wi
12880 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e  ll be overwritin
12890 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e  g WhereLoop p[].
128a0 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20    But before we 
128b0 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  do, first.    **
128c0 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20   go through the 
128d0 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74  rest of the list
128e0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20   and delete any 
128f0 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65  other entries be
12900 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d  sides.    ** p[]
12910 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
12920 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d  upplated by pTem
12930 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65  plate */.    Whe
12940 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20  reLoop **ppTail 
12950 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b  = &p->pNextLoop;
12960 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
12970 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c  pToDel;.    whil
12980 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20  e( *ppTail ){.  
12990 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65      ppTail = whe
129a0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
129b0 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61  (ppTail, pTempla
129c0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
129d0 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pTail==0 ) break
129e0 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d  ;.      pToDel =
129f0 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20   *ppTail;.      
12a00 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20  if( pToDel==0 ) 
12a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70  break;.      *pp
12a20 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70  Tail = pToDel->p
12a30 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48  NextLoop;.#if WH
12a40 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
12a50 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
12a60 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
12a70 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
12a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
12a90 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c  ebugPrintf(" del
12aa0 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ete: ");.       
12ab0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
12ac0 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72  pToDel, pBuilder
12ad0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  ->pWC);.      }.
12ae0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65  #endif.      whe
12af0 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
12b00 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a   pToDel);.    }.
12b10 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65    }.  rc = where
12b20 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
12b30 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66  pTemplate);.  if
12b40 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
12b50 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
12b60 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  LE)==0 ){.    In
12b70 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d  dex *pIndex = p-
12b80 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
12b90 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20  .    if( pIndex 
12ba0 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d  && pIndex->tnum=
12bb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75  =0 ){.      p->u
12bc0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
12bd0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
12be0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12bf0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68  ** Adjust the Wh
12c00 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c  ereLoop.nOut val
12c10 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61  ue downward to a
12c20 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73  ccount for terms
12c30 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   of the.** WHERE
12c40 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66   clause that ref
12c50 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20  erence the loop 
12c60 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
12c70 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20  t used by an.** 
12c80 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20  index..*.** For 
12c90 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75  every WHERE clau
12ca0 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  se term that is 
12cb0 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
12cc0 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69  index.** and whi
12cd0 63 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70  ch has a truth p
12ce0 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67  robability assig
12cf0 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68  ned by one of th
12d00 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a  e likelihood(),.
12d10 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20  ** likely(), or 
12d20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66  unlikely() SQL f
12d30 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65  unctions, reduce
12d40 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
12d50 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70  umber.** of outp
12d60 75 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70  ut rows by the p
12d70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69  robability speci
12d80 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49  fied..**.** TUNI
12d90 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57  NG:  For every W
12da0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12db0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65   that is not use
12dc0 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a  d by the index.*
12dd0 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73  * and which does
12de0 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73   not have an ass
12df0 69 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62  igned truth prob
12e00 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74  ability, heurist
12e10 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64  ics.** described
12e20 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20   below are used 
12e30 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  to try to estima
12e40 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f  te the truth pro
12e50 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44  bability..** TOD
12e60 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68  O --> Perhaps th
12e70 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  is is something 
12e80 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d  that could be im
12e90 70 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72  proved by better
12ea0 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73  .** table statis
12eb0 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72  tics..**.** Heur
12ec0 69 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61  istic 1:  Estima
12ed0 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f  te the truth pro
12ee0 62 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37  bability as 93.7
12ef0 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a  5%.  The 93.75%.
12f00 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70  ** value corresp
12f10 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f  onds to -1 in Lo
12f20 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73  gEst notation, s
12f30 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63  o this means dec
12f40 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68  rement.** the Wh
12f50 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65  ereLoop.nOut fie
12f60 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63  ld for every suc
12f70 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  h WHERE clause t
12f80 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  erm..**.** Heuri
12f90 73 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72  stic 2:  If ther
12fa0 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20  e exists one or 
12fb0 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  more WHERE claus
12fc0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  e terms of the.*
12fd0 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22  * form "x==EXPR"
12fe0 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74   and EXPR is not
12ff0 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72   a constant 0 or
13000 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75   1, then make su
13010 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20  re the.** final 
13020 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
13030 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65  ate is no greate
13040 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68  r than 1/4 of th
13050 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a  e total number.*
13060 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  * of rows in the
13070 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65   table.  In othe
13080 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20  r words, assume 
13090 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c  that x==EXPR wil
130a0 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20  l filter.** out 
130b0 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f  at least 3 out o
130c0 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58  f 4 rows.  If EX
130d0 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72  PR is -1 or 0 or
130e0 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74   1, then maybe t
130f0 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e  he.** "x" column
13100 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65   is boolean or e
13110 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31  lse -1 or 0 or 1
13120 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66   is a common def
13130 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e  ault value.** on
13140 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20   the "x" column 
13150 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63  and so in that c
13160 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65  ase only cap the
13170 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69   output row esti
13180 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69  mate.** at 1/2 i
13190 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a  nstead of 1/4..*
131a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
131b0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
131c0 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  ust(.  WhereClau
131d0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a  se *pWC,      /*
131e0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
131f0 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e */.  WhereLoop
13200 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a   *pLoop,      /*
13210 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a   The loop to adj
13220 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a  ust downward */.
13230 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20    LogEst nRow   
13240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13250 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
13260 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a  e entire table *
13270 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
13280 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20   *pTerm, *pX;.  
13290 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77  Bitmask notAllow
132a0 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72  ed = ~(pLoop->pr
132b0 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ereq|pLoop->mask
132c0 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20  Self);.  int i, 
132d0 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69  j, k;.  LogEst i
132e0 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f  Reduce = 0;    /
132f0 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68  * pLoop->nOut sh
13300 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20  ould not exceed 
13310 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a  nRow-iReduce */.
13320 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
13330 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
13340 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d  RE_AUTO_INDEX)==
13350 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  0 );.  for(i=pWC
13360 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70  ->nTerm, pTerm=p
13370 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  WC->a; i>0; i--,
13380 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
13390 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  f( (pTerm->wtFla
133a0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
133b0 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  L)!=0 ) break;. 
133c0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
133d0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
133e0 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29  ->maskSelf)==0 )
133f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
13400 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13410 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65  qAll & notAllowe
13420 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  d)!=0 ) continue
13430 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f  ;.    for(j=pLoo
13440 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  p->nLTerm-1; j>=
13450 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; j--){.      p
13460 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
13470 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
13480 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pX==0 ) continue
13490 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
134a0 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20  pTerm ) break;. 
134b0 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61       if( pX->iPa
134c0 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43  rent>=0 && (&pWC
134d0 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d  ->a[pX->iParent]
134e0 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b  )==pTerm ) break
134f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13500 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  j<0 ){.      if(
13510 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
13520 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b<=0 ){.        
13530 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72  /* If a truth pr
13540 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65  obability is spe
13550 63 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65  cified using the
13560 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69   likelihood() hi
13570 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  nts,.        ** 
13580 74 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f  then use the pro
13590 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65  bability provide
135a0 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61  d by the applica
135b0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
135c0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20   pLoop->nOut += 
135d0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
135e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
135f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
13600 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c   absence of expl
13610 69 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61  icit truth proba
13620 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65  bilities, use he
13630 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20  uristics to.    
13640 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72      ** guess a r
13650 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20  easonable truth 
13660 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a  probability. */.
13670 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
13680 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69  Out--;.        i
13690 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
136a0 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
136b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
136c0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
136d0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
136e0 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ht;.          te
136f0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
13700 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
13710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13720 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
13730 74 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b  teger(pRight, &k
13740 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20  ) && k>=(-1) && 
13750 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  k<=1 ){.        
13760 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20      k = 10;.    
13770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13780 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b           k = 20;
13790 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
137a0 20 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75         if( iRedu
137b0 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d  ce<k ) iReduce =
137c0 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   k;.        }.  
137d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
137e0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
137f0 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65  t > nRow-iReduce
13800 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   )  pLoop->nOut 
13810 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65  = nRow - iReduce
13820 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d  ;.}../* .** Term
13830 20 70 54 65 72 6d 20 69 73 20 61 20 76 65 63 74   pTerm is a vect
13840 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69  or range compari
13850 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  son operation. T
13860 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69  he first compari
13870 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65  son.** in the ve
13880 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69  ctor can be opti
13890 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75  mized using colu
138a0 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e  mn nEq of the in
138b0 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  dex. This.** fun
138c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
138d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
138e0 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74  f vector element
138f0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
13900 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66  ed.** as part of
13910 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61   the range compa
13920 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rison..**.** For
13930 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
13940 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
13950 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41     WHERE a = ? A
13960 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28  ND (b, c, d) > (
13970 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61  ?, ?, ?).**.** a
13980 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a  nd the index:.**
13990 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
139a0 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c  EX ... ON (a, b,
139b0 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20   c, d, e).**.** 
139c0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
139d0 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f  on would be invo
139e0 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20  ked with nEq=1. 
139f0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
13a00 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61  ed in.** this ca
13a10 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74  se is 3..*/.stat
13a20 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
13a30 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61  eVectorLen(.  Pa
13a40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13a50 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13a60 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
13a70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
13a80 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
13a90 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  n pIdx */.  Inde
13aa0 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
13ab0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
13ac0 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 69   be used for a i
13ad0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
13ae0 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  aint */.  int nE
13af0 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
13b00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f  * Number of prio
13b10 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  r equality const
13b20 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69  raints on same i
13b30 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54  ndex */.  WhereT
13b40 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f  erm *pTerm     /
13b50 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65  * The vector ine
13b60 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
13b70 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
13b80 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Cmp = sqlite3Exp
13b90 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72  rVectorSize(pTer
13ba0 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
13bb0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43  ;.  int i;..  nC
13bc0 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28  mp = MIN(nCmp, (
13bd0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20  pIdx->nColumn - 
13be0 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31  nEq));.  for(i=1
13bf0 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a  ; i<nCmp; i++){.
13c00 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63      /* Test if c
13c10 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70  omparison i of p
13c20 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62  Term is compatib
13c30 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28  le with column (
13c40 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f  i+nEq) .    ** o
13c50 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20  f the index. If 
13c60 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f  not, exit the lo
13c70 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  op.  */.    char
13c80 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20   aff;           
13c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
13ca0 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79  parison affinity
13cb0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78   */.    char idx
13cc0 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aff = 0;        
13cd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64        /* Indexed
13ce0 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
13cf0 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  y */.    CollSeq
13d00 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
13d10 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
13d20 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ison collation s
13d30 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45  equence */.    E
13d40 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72  xpr *pLhs = pTer
13d50 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  m->pExpr->pLeft-
13d60 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
13d70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
13d80 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45  pRhs = pTerm->pE
13d90 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
13da0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
13db0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
13dc0 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20  ){.      pRhs = 
13dd0 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  pRhs->x.pSelect-
13de0 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
13df0 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
13e00 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68        pRhs = pRh
13e10 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  s->x.pList->a[i]
13e20 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20  .pExpr;.    }.. 
13e30 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
13e40 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
13e50 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
13e60 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
13e70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72   to.    ** the r
13e80 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ight column of t
13e90 68 65 20 72 69 67 68 74 20 73 6f 75 72 63 65 20  he right source 
13ea0 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20  table. And that 
13eb0 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20  the sort.    ** 
13ec0 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64  order of the ind
13ed0 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  ex column is the
13ee0 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72   same as the sor
13ef0 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20  t order of the. 
13f00 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69     ** leftmost i
13f10 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f  ndex column.  */
13f20 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f  .    if( pLhs->o
13f30 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
13f40 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62     || pLhs->iTab
13f50 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c  le!=iCur .     |
13f60 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21  | pLhs->iColumn!
13f70 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
13f80 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20  i+nEq] .     || 
13f90 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
13fa0 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61  [i+nEq]!=pIdx->a
13fb0 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20  SortOrder[nEq]. 
13fc0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
13fd0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  k;.    }..    te
13fe0 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43  stcase( pLhs->iC
13ff0 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20  olumn==XN_ROWID 
14000 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  );.    aff = sql
14010 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
14020 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65  ity(pRhs, sqlite
14030 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
14040 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66  hs));.    idxaff
14050 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43   = sqlite3TableC
14060 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49  olumnAffinity(pI
14070 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73  dx->pTable, pLhs
14080 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
14090 69 66 28 20 61 66 66 21 3d 69 64 78 61 66 66 20  if( aff!=idxaff 
140a0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43  ) break;..    pC
140b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
140c0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
140d0 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
140e0 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70  pRhs);.    if( p
140f0 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Coll==0 ) break;
14100 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14110 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
14120 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
14130 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65  ll[i+nEq]) ) bre
14140 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
14150 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a   i;.}../*.** Adj
14160 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62  ust the cost C b
14170 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66  y the costMult f
14180 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f  acter T.  This o
14190 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a  nly occurs if.**
141a0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d   compiled with -
141b0 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  DSQLITE_ENABLE_C
141c0 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65  OSTMULT.*/.#ifde
141d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
141e0 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e  COSTMULT.# defin
141f0 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
14200 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d  plier(C,T)  C +=
14210 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   T.#else.# defin
14220 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69  e ApplyCostMulti
14230 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69  plier(C,T).#endi
14240 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65  f../*.** We have
14250 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20   so far matched 
14260 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
14270 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d  u.btree.nEq term
14280 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64  s of the .** ind
14290 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74  ex pIndex. Try t
142a0 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65  o match one more
142b0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
142c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
142d0 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e  lled, pBuilder->
142e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61  pNew->nOut conta
142f0 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62  ins the .** numb
14300 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
14310 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65  ted to be visite
14320 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75  d by filtering u
14330 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a  sing the nEq .**
14340 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20   terms only. If 
14350 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  it is modified, 
14360 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65  this value is re
14370 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68  stored before th
14380 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
14390 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
143a0 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d  f pProbe->tnum==
143b0 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49  0, that means pI
143c0 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69  ndex is a fake i
143d0 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68  ndex used for th
143e0 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
143f0 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61  MARY KEY..*/.sta
14400 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
14410 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a  pAddBtreeIndex(.
14420 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
14430 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20  er *pBuilder,   
14440 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
14450 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20  op factory */.  
14460 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14470 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
14480 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
14490 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
144a0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
144b0 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20  Probe,          
144c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
144d0 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20  dex on pSrc */. 
144e0 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20   LogEst nInMul  
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f   /* log(Number o
14510 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65  f iterations due
14520 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20   to IN) */.){.  
14530 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
14540 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
14550 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20  Info;  /* WHERE 
14560 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20  analyse context 
14570 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
14580 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
14590 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  rse;        /* P
145a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
145b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
145c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
145d0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
145e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f  connection mallo
145f0 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  c context */.  W
14600 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14620 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
14630 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74  Loop under const
14640 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  ruction */.  Whe
14650 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14670 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65  A WhereTerm unde
14680 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  r consideration 
14690 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b  */.  int opMask;
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70       /* Valid op
146c0 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73  erators for cons
146d0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65  traints */.  Whe
146e0 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20  reScan scan;    
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14700 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45  Iterator for WHE
14710 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  RE terms */.  Bi
14720 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72  tmask saved_prer
14730 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eq;           /*
14740 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14750 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  of pNew->prereq 
14760 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
14770 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
14780 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
14790 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
147a0 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20  nLTerm */.  u16 
147b0 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20  saved_nEq;      
147c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
147d0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
147e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
147f0 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  Eq */.  u16 save
14800 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20  d_nBtm;         
14810 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14820 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14830 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
14840 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
14850 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
14860 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
14870 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
14880 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a  u.btree.nTop */.
14890 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
148a0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
148b0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
148c0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
148d0 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
148e0 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
148f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14900 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14910 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
14920 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
14930 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
14940 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
14950 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
14960 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
14970 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
14980 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
14990 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
149a0 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
149b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
149c0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
149d0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
149e0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a00 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
14a10 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
14a20 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
14a30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
14a40 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
14a50 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
14a60 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
14a70 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
14a80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14a90 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
14aa0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14ab0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
14ac0 38 30 30 2c 20 28 22 42 45 47 49 4e 20 61 64 64  800, ("BEGIN add
14ad0 42 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45  BtreeIdx(%s), nE
14ae0 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  q=%d\n",.       
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
14b00 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65  robe->zName, pNe
14b10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 29  w->u.btree.nEq))
14b20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
14b30 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
14b40 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
14b50 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
14b60 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
14b70 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
14b80 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
14b90 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
14ba0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
14bb0 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
14bc0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
14bd0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14be0 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
14bf0 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 6f  nBtm==0 );.    o
14c00 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  pMask = WO_EQ|WO
14c10 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _IN|WO_GT|WO_GE|
14c20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49  WO_LT|WO_LE|WO_I
14c30 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d  SNULL|WO_IS;.  }
14c40 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
14c50 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
14c60 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
14c70 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
14c80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
14c90 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70  w->u.btree.nEq<p
14ca0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
14cb0 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d  ;..  saved_nEq =
14cc0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14cd0 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74 6d  Eq;.  saved_nBtm
14ce0 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
14cf0 2e 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f 6e  .nBtm;.  saved_n
14d00 54 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  Top = pNew->u.bt
14d10 72 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76 65  ree.nTop;.  save
14d20 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e  d_nSkip = pNew->
14d30 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e  nSkip;.  saved_n
14d40 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c  LTerm = pNew->nL
14d50 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73  Term;.  saved_ws
14d60 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73  Flags = pNew->ws
14d70 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70  Flags;.  saved_p
14d80 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72  rereq = pNew->pr
14d90 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f  ereq;.  saved_nO
14da0 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ut = pNew->nOut;
14db0 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  .  pTerm = where
14dc0 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20  ScanInit(&scan, 
14dd0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
14de0 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61  Src->iCursor, sa
14df0 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20  ved_nEq,.       
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29   opMask, pProbe)
14e20 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
14e30 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20   = 0;.  rSize = 
14e40 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
14e50 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69  Est[0];.  rLogSi
14e60 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a  ze = estLog(rSiz
14e70 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d  e);.  for(; rc==
14e80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
14e90 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77  rm!=0; pTerm = w
14ea0 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
14eb0 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f  an)){.    u16 eO
14ec0 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  p = pTerm->eOper
14ed0 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74  ator;   /* Short
14ee0 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e  hand for pTerm->
14ef0 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20  eOperator */.   
14f00 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78   LogEst rCostIdx
14f10 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75  ;.    LogEst nOu
14f20 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20  tUnadjusted;    
14f30 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f      /* nOut befo
14f40 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52  re IN() and WHER
14f50 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f  E adjustments */
14f60 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  .    int nIn = 0
14f70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14f80 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
14f90 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52  STAT4.    int nR
14fa0 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64  ecValid = pBuild
14fb0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23  er->nRecValid;.#
14fc0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65  endif.    if( (e
14fd0 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c  Op==WO_ISNULL ||
14fe0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
14ff0 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29  &TERM_VNULL)!=0)
15000 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78 43 6f  .     && indexCo
15010 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f  lumnNotNull(pPro
15020 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a 20  be, saved_nEq). 
15030 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74     ){.      cont
15040 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20  inue; /* ignore 
15050 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f  IS [NOT] NULL co
15060 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54  nstraints on NOT
15070 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
15080 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15090 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
150a0 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
150b0 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  lf ) continue;..
150c0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
150d0 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20 62 6f  low the upper bo
150e0 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70  und of a LIKE op
150f0 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65  timization range
15100 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20   constraint.    
15110 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61  ** to mix with a
15120 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75   lower range bou
15130 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68  nd from some oth
15140 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20  er source */.   
15150 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
15160 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
15170 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70  PT && pTerm->eOp
15180 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20  erator==WO_LT ) 
15190 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
151a0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 49  * Do not allow I
151b0 53 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 72  S constraints fr
151c0 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  om the WHERE cla
151d0 75 73 65 20 74 6f 20 62 65 20 75 73 65 64 20 62  use to be used b
151e0 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 69 67  y the.    ** rig
151f0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
15200 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63  FT JOIN.  Only c
15210 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
15220 65 20 4f 4e 20 63 6c 61 75 73 65 20 61 72 65 0a  e ON clause are.
15230 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a      ** allowed *
15240 2f 0a 20 20 20 20 69 66 28 20 28 70 53 72 63 2d  /.    if( (pSrc-
15250 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
15260 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20  T_LEFT)!=0.     
15270 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
15280 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
15290 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
152a0 20 20 20 20 26 26 20 28 65 4f 70 20 26 20 28 57      && (eOp & (W
152b0 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29  O_IS|WO_ISNULL))
152c0 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
152d0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
152e0 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
152f0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
15300 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
15310 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
15320 20 7d 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   }..    pNew->ws
15330 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15340 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
15350 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
15360 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
15370 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
15380 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
15390 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
153a0 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54  .nTop = saved_nT
153b0 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  op;.    pNew->nL
153c0 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
153d0 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65  erm;.    if( whe
153e0 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
153f0 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
15400 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20  erm+1) ) break; 
15410 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e  /* OOM */.    pN
15420 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
15430 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65  >nLTerm++] = pTe
15440 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72  rm;.    pNew->pr
15450 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72  ereq = (saved_pr
15460 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72  ereq | pTerm->pr
15470 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e  ereqRight) & ~pN
15480 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20  ew->maskSelf;.. 
15490 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75     assert( nInMu
154a0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20  l==0.        || 
154b0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
154c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
154d0 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LL)!=0 .        
154e0 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  || (pNew->wsFlag
154f0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
15500 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20  _IN)!=0 .       
15510 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
15520 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53  gs & WHERE_SKIPS
15530 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a  CAN)!=0 .    );.
15540 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57  .    if( eOp & W
15550 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
15560 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
15570 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
15580 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15590 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
155a0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
155b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
155c0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
155d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
155e0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
155f0 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
15600 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
15610 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
15620 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15630 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73    nIn = 46;  ass
15640 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33  ert( 46==sqlite3
15650 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 0a 20  LogEst(25) );.. 
15660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
15670 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 61 63 74  pression may act
15680 75 61 6c 6c 79 20 62 65 20 6f 66 20 74 68 65 20  ually be of the 
15690 66 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e 20 28  form (x, y) IN (
156a0 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20  SELECT...)..    
156b0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
156c0 61 73 65 20 74 68 65 72 65 20 69 73 20 61 20 73  ase there is a s
156d0 65 70 61 72 61 74 65 20 74 65 72 6d 20 66 6f 72  eparate term for
156e0 20 65 61 63 68 20 6f 66 20 28 78 29 20 61 6e 64   each of (x) and
156f0 20 28 79 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a   (y)..        **
15700 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 6e 49   However, the nI
15710 6e 20 6d 75 6c 74 69 70 6c 69 65 72 20 73 68 6f  n multiplier sho
15720 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c  uld only be appl
15730 69 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e  ied once, not on
15740 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  ce.        ** fo
15750 72 20 65 61 63 68 20 73 75 63 68 20 74 65 72 6d  r each such term
15760 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
15770 6c 6f 6f 70 20 63 68 65 63 6b 73 20 74 68 61 74  loop checks that
15780 20 70 54 65 72 6d 20 69 73 20 74 68 65 0a 20 20   pTerm is the.  
15790 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 73        ** first s
157a0 75 63 68 20 74 65 72 6d 20 69 6e 20 75 73 65 2c  uch term in use,
157b0 20 61 6e 64 20 73 65 74 73 20 6e 49 6e 20 62 61   and sets nIn ba
157c0 63 6b 20 74 6f 20 30 20 69 66 20 69 74 20 69 73  ck to 0 if it is
157d0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
157e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77   for(i=0; i<pNew
157f0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29  ->nLTerm-1; i++)
15800 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
15810 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
15820 26 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b  && pNew->aLTerm[
15830 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78 70 72  i]->pExpr==pExpr
15840 20 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20   ) nIn = 0;.    
15850 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15860 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
15870 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
15880 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
15890 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
158a0 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65   /* "x IN (value
158b0 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a  , value, ...)" *
158c0 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  /.        nIn = 
158d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45  sqlite3LogEst(pE
158e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
158f0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  xpr);.        as
15900 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b 20 20  sert( nIn>0 );  
15910 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20 68 61  /* RHS always ha
15920 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  s 2 or more term
15930 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73 65 72  s...  The parser
15940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15950 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
15960 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29 22  anges "x IN (?)"
15970 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a   into "x=?". */.
15980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15990 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f  e if( eOp & (WO_
159a0 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20  EQ|WO_IS) ){.   
159b0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50     int iCol = pP
159c0 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73  robe->aiColumn[s
159d0 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20 20 20  aved_nEq];.     
159e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
159f0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
15a00 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  Q;.      assert(
15a10 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e 65 77   saved_nEq==pNew
15a20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
15a30 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d  .      if( iCol=
15a40 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20 20 20  =XN_ROWID .     
15a50 20 20 7c 7c 20 28 69 43 6f 6c 3e 30 20 26 26 20    || (iCol>0 && 
15a60 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 73 61 76  nInMul==0 && sav
15a70 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e  ed_nEq==pProbe->
15a80 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20 20 20 20  nKeyCol-1).     
15a90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15aa0 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62  iCol>=0 && pProb
15ab0 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d  e->uniqNotNull==
15ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
15ad0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15ae0 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
15af0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15b00 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
15b10 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
15b20 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
15b30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15b40 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
15b50 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
15b60 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15b70 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
15b80 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
15b90 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
15ba0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
15bb0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15bc0 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
15bd0 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
15be0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
15bf0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15c00 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
15c10 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
15c20 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  MIT;.      pNew-
15c30 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20  >u.btree.nBtm = 
15c40 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72  whereRangeVector
15c50 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  Len(.          p
15c60 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75  Parse, pSrc->iCu
15c70 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61  rsor, pProbe, sa
15c80 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20  ved_nEq, pTerm. 
15c90 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 42       );.      pB
15ca0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
15cb0 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
15cc0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
15cd0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
15ce0 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
15cf0 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
15d00 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
15d10 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
15d20 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
15d30 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
15d40 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
15d50 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
15d60 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
15d70 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
15d80 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
15d90 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
15da0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
15db0 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
15dc0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
15dd0 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
15de0 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
15df0 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
15e00 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
15e10 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
15e20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
15e30 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
15e40 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
15e50 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
15e60 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
15e70 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
15e80 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15e90 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
15ea0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
15eb0 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a  btree.nTop = 1;.
15ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15ed0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
15ee0 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
15ef0 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
15f00 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
15f10 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
15f20 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
15f30 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
15f40 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15f50 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
15f60 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
15f70 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
15f80 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77 68 65 72  tree.nTop = wher
15f90 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
15fa0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
15fb0 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
15fc0 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  , pProbe, saved_
15fd0 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20  nEq, pTerm.     
15fe0 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d   );.      pTop =
15ff0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42   pTerm;.      pB
16000 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c  tm = (pNew->wsFl
16010 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
16020 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20  LIMIT)!=0 ?.    
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
16050 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20  ew->nLTerm-2] : 
16060 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
16070 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
16080 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74  New->nOut is set
16090 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
160a0 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
160b0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73  to.    ** be vis
160c0 69 74 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  ited by the inde
160d0 78 20 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f  x scan before co
160e0 6e 73 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70  nsidering term p
160f0 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20  Term, or the.   
16100 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49   ** values of nI
16110 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e  n and nInMul. In
16120 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
16130 73 75 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  suming that all 
16140 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e  .    ** "x IN(..
16150 2e 29 22 20 74 65 72 6d 73 20 61 72 65 20 72 65  .)" terms are re
16160 70 6c 61 63 65 64 20 77 69 74 68 20 22 78 20 3d  placed with "x =
16170 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20   ?". This block 
16180 75 70 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  updates.    ** t
16190 68 65 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  he value of pNew
161a0 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e  ->nOut to accoun
161b0 74 20 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74  t for pTerm (but
161c0 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29   not nIn/nInMul)
161d0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
161e0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
161f0 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
16200 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
16210 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
16220 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
16230 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75  /* Adjust nOut u
16240 73 69 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34  sing stat3/stat4
16250 20 64 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68   data. Or, if th
16260 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f  ere is no stat3/
16270 73 74 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64  stat4.      ** d
16280 61 74 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20  ata, using some 
16290 6f 74 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20  other estimate. 
162a0 20 2a 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52   */.      whereR
162b0 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72  angeScanEst(pPar
162c0 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42  se, pBuilder, pB
162d0 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b  tm, pTop, pNew);
162e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
162f0 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e    int nEq = ++pN
16300 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
16310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
16320 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  Op & (WO_ISNULL|
16330 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
16340 53 29 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  S) );..      ass
16350 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
16360 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
16370 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
16380 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 26 26 20  truthProb<=0 && 
16390 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
163a0 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29  [saved_nEq]>=0 )
163b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
163c0 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  ( (eOp & WO_IN) 
163d0 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  || nIn==0 );.   
163e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
163f0 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  Op & WO_IN );.  
16400 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
16410 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
16420 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e  Prob;.        pN
16430 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
16440 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  .      }else{.#i
16450 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16460 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
16470 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e  4.        tRowcn
16480 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t nOut = 0;.    
16490 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d      if( nInMul==
164a0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
164b0 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a  Probe->nSample .
164c0 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77           && pNew
164d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
164e0 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f  Probe->nSampleCo
164f0 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  l.         && ((
16500 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  eOp & WO_IN)==0 
16510 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  || !ExprHasPrope
16520 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
16530 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
16540 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
16550 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
16560 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
16570 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16580 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f  (eOp & (WO_EQ|WO
16590 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
165a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
165b0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
165c0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
165d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
165e0 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
165f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16600 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
16610 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
16620 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
16630 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
16640 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45  se, pBuilder, pE
16650 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f  xpr->pRight, &nO
16660 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
16670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16680 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63    rc = whereInSc
16690 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
166a0 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78  uilder, pExpr->x
166b0 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a  .pList, &nOut);.
166c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
166d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
166e0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20  LITE_NOTFOUND ) 
166f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
16710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
16720 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eak;          /*
16730 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   Jump out of the
16740 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20   pTerm loop */. 
16750 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75           if( nOu
16760 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16770 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
16780 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74  lite3LogEst(nOut
16790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
167a0 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61  f( pNew->nOut>sa
167b0 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d  ved_nOut ) pNew-
167c0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
167d0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
167e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49  pNew->nOut -= nI
167f0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
16800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16810 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23   if( nOut==0 ).#
16820 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
16830 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16840 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d  nOut += (pProbe-
16850 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
16860 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
16870 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b  wLogEst[nEq-1]);
16880 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
16890 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
168a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
168b0 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
168c0 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f  e is no likeliho
168d0 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75  od() value, assu
168e0 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20  me that a .     
168f0 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49         ** "col I
16900 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69  S NULL" expressi
16910 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63 65  on matches twice
16920 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20   as many rows . 
16930 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73             ** as
16940 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20   (col=?). */.   
16950 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
16960 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  Out += 10;.     
16970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16990 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74      /* Set rCost
169a0 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20  Idx to the cost 
169b0 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65  of visiting sele
169c0 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64  cted rows in ind
169d0 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69  ex. Add.    ** i
169e0 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c  t to pNew->rRun,
169f0 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65 6e   which is curren
16a00 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  tly set to the c
16a10 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ost of the index
16a20 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c  .    ** seek onl
16a30 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73  y. Then, if this
16a40 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
16a50 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68  ng index, add th
16a60 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a  e cost of.    **
16a70 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f   visiting the ro
16a80 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ws in the main t
16a90 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43  able.  */.    rC
16aa0 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e  ostIdx = pNew->n
16ab0 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  Out + 1 + (15*pP
16ac0 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
16ad0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61  pSrc->pTab->szTa
16ae0 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  bRow;.    pNew->
16af0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
16b00 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  gEstAdd(rLogSize
16b10 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20  , rCostIdx);.   
16b20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
16b30 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
16b40 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
16b50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  )==0 ){.      pN
16b60 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
16b70 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77  e3LogEstAdd(pNew
16b80 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f  ->rRun, pNew->nO
16b90 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a  ut + 16);.    }.
16ba0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
16bb0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52  tiplier(pNew->rR
16bc0 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62  un, pProbe->pTab
16bd0 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a  le->costMult);..
16be0 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74      nOutUnadjust
16bf0 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b  ed = pNew->nOut;
16c00 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
16c10 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
16c20 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
16c30 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b  += nInMul + nIn;
16c40 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75  .    whereLoopOu
16c50 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c  tputAdjust(pBuil
16c60 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20  der->pWC, pNew, 
16c70 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  rSize);.    rc =
16c80 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
16c90 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
16ca0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
16cb0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16cc0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
16cd0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
16ce0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
16cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16d00 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f   pNew->nOut = nO
16d10 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20  utUnadjusted;.  
16d20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e    }..    if( (pN
16d30 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
16d40 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d  ERE_TOP_LIMIT)==
16d50 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e  0.     && pNew->
16d60 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
16d70 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  be->nColumn.    
16d80 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
16d90 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
16da0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
16db0 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
16dc0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  In);.    }.    p
16dd0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
16de0 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53  d_nOut;.#ifdef S
16df0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16e00 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
16e10 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
16e20 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
16e30 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e  .#endif.  }.  pN
16e40 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76  ew->prereq = sav
16e50 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65  ed_prereq;.  pNe
16e60 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
16e70 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e   saved_nEq;.  pN
16e80 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
16e90 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20   = saved_nBtm;. 
16ea0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16eb0 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
16ec0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20  ;.  pNew->nSkip 
16ed0 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
16ee0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
16ef0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
16f00 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
16f10 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
16f20 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
16f30 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20  d_nLTerm;..  /* 
16f40 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61  Consider using a
16f50 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68   skip-scan if th
16f60 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
16f70 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
16f80 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  nts.  ** availab
16f90 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d  le for the left-
16fa0 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68  most terms of th
16fb0 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20  e index, and if 
16fc0 74 68 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a  the average.  **
16fd0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61   number of repea
16fe0 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ts in the left-m
16ff0 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61 74 20  ost terms is at 
17000 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a  least 18. .  **.
17010 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e    ** The magic n
17020 75 6d 62 65 72 20 31 38 20 69 73 20 73 65 6c 65  umber 18 is sele
17030 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69  cted on the basi
17040 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20  s that scanning 
17050 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20  17 rows.  ** is 
17060 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75  almost always qu
17070 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e  icker than an in
17080 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74  dex seek (even t
17090 68 6f 75 67 68 20 69 66 20 74 68 65 20 69 6e 64  hough if the ind
170a0 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  ex.  ** contains
170b0 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37   fewer than 2^17
170c0 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20   rows we assume 
170d0 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68  otherwise in oth
170e0 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a  er parts of.  **
170f0 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c   the code). And,
17100 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
17110 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f  ot, it should no
17120 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c  t be too much sl
17130 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74  ower. .  ** On t
17140 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
17150 68 65 20 65 78 74 72 61 20 73 65 65 6b 73 20 63  he extra seeks c
17160 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e  ould end up bein
17170 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  g significantly.
17180 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73    ** more expens
17190 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ive.  */.  asser
171a0 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 42==sqlite3Lo
171b0 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66  gEst(18) );.  if
171c0 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76  ( saved_nEq==sav
171d0 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73  ed_nSkip.   && s
171e0 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62  aved_nEq+1<pProb
171f0 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26  e->nKeyCol.   &&
17200 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53   pProbe->noSkipS
17210 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72  can==0.   && pPr
17220 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17230 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34  [saved_nEq+1]>=4
17240 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69  2  /* TUNING: Mi
17250 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73  nimum for skip-s
17260 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63  can */.   && (rc
17270 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69   = whereLoopResi
17280 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
17290 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53  w->nLTerm+1))==S
172a0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
172b0 20 20 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a    LogEst nIter;.
172c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
172d0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65  e.nEq++;.    pNe
172e0 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20  w->nSkip++;.    
172f0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
17300 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30  w->nLTerm++] = 0
17310 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
17320 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49  ags |= WHERE_SKI
17330 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72  PSCAN;.    nIter
17340 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
17350 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
17360 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ] - pProbe->aiRo
17370 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
17380 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  q+1];.    pNew->
17390 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20  nOut -= nIter;. 
173a0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42     /* TUNING:  B
173b0 65 63 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e  ecause uncertain
173c0 74 69 65 73 20 69 6e 20 74 68 65 20 65 73 74 69  ties in the esti
173d0 6d 61 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73  mates for skip-s
173e0 63 61 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20  can queries,.   
173f0 20 2a 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20   ** add a 1.375 
17400 66 75 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20  fudge factor to 
17410 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73  make skip-scan s
17420 6c 69 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b  lightly less lik
17430 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65  ely. */.    nIte
17440 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72  r += 5;.    wher
17450 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
17460 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
17470 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72  c, pProbe, nIter
17480 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   + nInMul);.    
17490 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
174a0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  ed_nOut;.    pNe
174b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
174c0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
174d0 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
174e0 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70  ved_nSkip;.    p
174f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
17500 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
17510 7d 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  }..  WHERETRACE(
17520 30 78 38 30 30 2c 20 28 22 45 4e 44 20 61 64 64  0x800, ("END add
17530 42 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45  BtreeIdx(%s), nE
17540 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a  q=%d, rc=%d\n",.
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 20 20 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e        pProbe->zN
17570 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20  ame, saved_nEq, 
17580 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rc));.  return r
17590 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
175a0 72 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73  rn True if it is
175b0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70   possible that p
175c0 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75  Index might be u
175d0 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c  seful in.** impl
175e0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
175f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
17600 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
17610 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20  Return False if 
17620 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f  pBuilder does no
17630 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44  t contain an ORD
17640 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
17650 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
17660 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78  o way for pIndex
17670 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e   to be useful in
17680 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
17690 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  at.** ORDER BY c
176a0 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
176b0 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48   int indexMightH
176c0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a  elpWithOrderBy(.
176d0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
176e0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
176f0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20  Index *pIndex,. 
17700 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a   int iCursor.){.
17710 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b    ExprList *pOB;
17720 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 61 43 6f  .  ExprList *aCo
17730 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 69 2c  lExpr;.  int ii,
17740 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
17750 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
17760 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
17770 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
17780 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
17790 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
177a0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
177b0 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
177c0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
177d0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
177e0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
177f0 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
17800 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
17810 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
17820 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
17830 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
17840 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
17850 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
17860 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  ;.      for(jj=0
17870 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
17880 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
17890 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
178a0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
178b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20  >aiColumn[jj] ) 
178c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
178d0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
178e0 28 61 43 6f 6c 45 78 70 72 20 3d 20 70 49 6e 64  (aColExpr = pInd
178f0 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 21 3d 30  ex->aColExpr)!=0
17900 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a   ){.      for(jj
17910 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e  =0; jj<pIndex->n
17920 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20  KeyCol; jj++){. 
17930 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
17940 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21  x->aiColumn[jj]!
17950 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69  =XN_EXPR ) conti
17960 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
17970 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
17980 61 72 65 28 70 45 78 70 72 2c 61 43 6f 6c 45 78  are(pExpr,aColEx
17990 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c  pr->a[jj].pExpr,
179a0 69 43 75 72 73 6f 72 29 3d 3d 30 20 29 7b 0a 20  iCursor)==0 ){. 
179b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
179c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
179d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
179e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
179f0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
17a00 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
17a10 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
17a20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
17a30 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
17a40 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
17a50 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
17a60 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
17a70 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
17a80 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
17a90 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
17aa0 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
17ab0 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
17ac0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
17ad0 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
17ae0 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
17af0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
17b00 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
17b10 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
17b20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17b30 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
17b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
17b50 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
17b60 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
17b70 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
17b80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17b90 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
17ba0 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
17bb0 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
17bc0 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
17bd0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
17be0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
17bf0 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
17c00 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
17c10 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
17c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17c30 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
17c40 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
17c50 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
17c60 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
17c70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
17c80 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
17c90 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
17ca0 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
17cb0 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61 62    if( !whereUsab
17cc0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
17cd0 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e  Tab,pWC,pWhere->
17ce0 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
17cf0 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  0;.    pWhere = 
17d00 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a  pWhere->pRight;.
17d10 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
17d20 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
17d30 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
17d40 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
17d50 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
17d60 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
17d70 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  ( sqlite3ExprImp
17d80 6c 69 65 73 45 78 70 72 28 70 45 78 70 72 2c 20  liesExpr(pExpr, 
17d90 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20  pWhere, iTab) . 
17da0 20 20 20 20 26 26 20 28 21 45 78 70 72 48 61 73      && (!ExprHas
17db0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17dc0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20  EP_FromJoin) || 
17dd0 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
17de0 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20  nTable==iTab).  
17df0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
17e00 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
17e10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
17e20 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
17e30 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
17e40 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
17e50 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
17e60 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
17e70 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
17e80 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
17e90 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
17ea0 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
17eb0 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
17ec0 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
17ed0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
17ee0 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28  *.** The costs (
17ef0 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20  WhereLoop.rRun) 
17f00 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f  of the b-tree lo
17f10 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69  ops added by thi
17f20 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  s function.** ar
17f30 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  e calculated as 
17f40 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46  follows:.**.** F
17f50 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20  or a full scan, 
17f60 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62  assuming the tab
17f70 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f  le (or index) co
17f80 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73  ntains nRow rows
17f90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
17fa0 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20   = nRow * 3.0   
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73   // full-table s
17fd0 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  can.**     cost 
17fe0 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20  = nRow * K      
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72  // scan of cover
18010 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18020 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28   cost = nRow * (
18030 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20  K+3.0)          
18040 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
18050 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
18060 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  dex.**.** where 
18070 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74  K is a value bet
18080 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
18090 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
180a0 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65  e relative .** e
180b0 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65  stimated average
180c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
180d0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63  ex and table rec
180e0 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ords..**.** For 
180f0 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77  an index scan, w
18100 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74  here nVisit is t
18110 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  he number of ind
18120 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a  ex rows visited.
18130 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20  ** by the scan, 
18140 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65  and nSeek is the
18150 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20   number of seek 
18160 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69  operations requi
18170 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69  red on .** the i
18180 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a  ndex b-tree:.**.
18190 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
181a0 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
181b0 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20   + K * nVisit)  
181c0 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72          // cover
181d0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
181e0 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
181f0 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b  (log(nRow) + (K+
18200 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20  3.0) * nVisit)  
18210 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e    // non-coverin
18220 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f  g index.**.** No
18230 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73  rmally, nSeek is
18240 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73   1. nSeek values
18250 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20   greater than 1 
18260 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68  come about if th
18270 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  e .** WHERE clau
18280 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49  se includes "x I
18290 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20  N (....)" terms 
182a0 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
182b0 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20   "x=?". Or when 
182c0 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20  .** implicit "x 
182d0 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
182e0 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72  M tbl)" terms ar
182f0 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70  e added for skip
18300 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  -scans..**.** Th
18310 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75  e estimated valu
18320 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74  es (nRow, nVisit
18330 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63  , nSeek) often c
18340 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61  ontain a large a
18350 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65  mount.** of unce
18360 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68  rtainty.  For th
18370 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69  is reason, scori
18380 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ng is designed t
18390 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61  o pick plans tha
183a0 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61  t.** "do the lea
183b0 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20  st harm" if the 
183c0 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e  estimates are in
183d0 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65  accurate.  For e
183e0 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67  xample, a.** log
183f0 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73  (nRow) factor is
18400 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20   omitted from a 
18410 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18420 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72  ex scan in order
18430 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20   to.** bias the 
18440 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72  scoring in favor
18450 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
18460 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f  ex, since the wo
18470 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66  rst-case.** perf
18480 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67  ormance of using
18490 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72   an index is far
184a0 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
184b0 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66   worst-case perf
184c0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20  ormance.** of a 
184d0 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e  full table scan.
184e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
184f0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
18500 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
18510 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
18520 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18530 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
18540 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18560 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
18570 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
18580 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
18590 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
185a0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
185b0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
185c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
185d0 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
185e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
185f0 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
18600 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
18610 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
18620 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
18630 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
18640 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
18650 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69  y */.  LogEst ai
18660 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20  RowEstPk[2];    
18670 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c     /* The aiRowL
18680 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  ogEst[] value fo
18690 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
186a0 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d  */.  i16 aiColum
186b0 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
186c0 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
186d0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
186e0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
186f0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
18700 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
18710 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
18720 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18730 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
18740 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
18750 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
18760 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
18770 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
18780 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
18790 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
187a0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
187b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
187c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
187d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
187e0 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
187f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
18800 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18820 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
18830 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45   value */.  LogE
18840 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
18850 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
18860 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
18870 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
18880 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
18890 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
188a0 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62  ithm of the numb
188b0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
188c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
188d0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
188e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
188f0 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61  parsed WHERE cla
18900 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  use */.  Table *
18910 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
18920 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
18930 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
18940 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c   .  pNew = pBuil
18950 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49  der->pNew;.  pWI
18960 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
18970 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69  pWInfo;.  pTabLi
18980 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
18990 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20  bList;.  pSrc = 
189a0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
189b0 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62  ew->iTab;.  pTab
189c0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
189d0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
189e0 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20  >pWC;.  assert( 
189f0 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
18a00 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
18a10 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
18a20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
18a30 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
18a40 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
18a50 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
18a60 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65  se */.    pProbe
18a70 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65   = pSrc->pIBInde
18a80 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  x;.  }else if( !
18a90 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
18aa0 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  {.    pProbe = p
18ab0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Tab->pIndex;.  }
18ac0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
18ad0 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
18ae0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
18af0 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
18b00 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
18b10 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
18b20 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
18b30 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
18b40 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
18b50 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
18b60 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
18b70 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
18b80 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
18b90 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
18ba0 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
18bb0 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
18bc0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
18bd0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
18be0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
18bf0 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
18c00 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
18c10 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
18c20 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
18c30 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79  ));.    sPk.nKey
18c40 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  Col = 1;.    sPk
18c50 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
18c60 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
18c70 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
18c80 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73    sPk.aiRowLogEs
18c90 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
18ca0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
18cb0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
18cc0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
18cd0 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49  Tab;.    sPk.szI
18ce0 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a  dxRow = pTab->sz
18cf0 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f  TabRow;.    aiRo
18d00 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
18d10 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
18d20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
18d30 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
18d40 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
18d50 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
18d60 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
18d70 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
18d80 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
18d90 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
18da0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
18db0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
18dc0 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
18dd0 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
18de0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
18df0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
18e00 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
18e10 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
18e20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
18e30 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
18e40 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
18e50 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
18e60 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
18e70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18e80 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
18e90 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
18ea0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
18eb0 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
18ec0 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61  t      /* Not pa
18ed0 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69  rt of an OR opti
18ee0 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26  mization */.   &
18ef0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
18f00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
18f10 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
18f20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
18f30 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
18f40 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
18f50 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
18f60 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20  c->pIBIndex==0  
18f70 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e      /* Has no IN
18f80 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
18f90 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
18fa0 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20  fg.notIndexed   
18fb0 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e  /* Has no NOT IN
18fc0 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a  DEXED clause */.
18fd0 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
18fe0 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab)         /* 
18ff0 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49  Not WITHOUT ROWI
19000 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a  D table. (FIXME:
19010 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20   Why not?) */.  
19020 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
19030 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f  Correlated /* No
19040 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
19050 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26  ubquery */.   &&
19060 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63   !pSrc->fg.isRec
19070 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61  ursive  /* Not a
19080 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f   recursive commo
19090 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
190a0 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  on. */.  ){.    
190b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
190c0 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
190d0 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
190e0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
190f0 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
19100 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
19110 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
19120 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
19130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
19140 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
19150 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
19160 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19170 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
19180 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
19190 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
191a0 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
191b0 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
191c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
191d0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
191e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b         pNew->nSk
191f0 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
19200 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
19210 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
19220 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
19230 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19240 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
19250 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
19260 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
19270 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
19280 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
19290 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
192a0 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20     ** estimated 
192b0 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e  to be X*N*log2(N
192c0 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
192d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
192e0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
192f0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
19300 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20  dexed and where 
19310 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32  X is 7 (LogEst=2
19320 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  8) for normal.  
19330 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
19340 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74  or 1.375 (LogEst
19350 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e  =4) for views an
19360 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  d subqueries.  T
19370 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
19380 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c   ** of X is smal
19390 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e  ler for views an
193a0 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20  d subqueries so 
193b0 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
193c0 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a  lanner.        *
193d0 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61  * will be more a
193e0 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20  ggressive about 
193f0 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d  generating autom
19400 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72  atic indexes for
19410 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73  .        ** thos
19420 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65  e objects, since
19430 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70   there is no opp
19440 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20  ortunity to add 
19450 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a  schema.        *
19460 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62  * indexes on sub
19470 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77  queries and view
19480 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
19490 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
194a0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
194b0 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  4;.        if( p
194c0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
194d0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
194e0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
194f0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
19500 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
19510 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d  += 24;.        }
19520 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
19530 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19540 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d  w->rSetup, pTab-
19550 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
19560 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53      if( pNew->rS
19570 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72  etup<0 ) pNew->r
19580 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
19590 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
195a0 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
195b0 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
195c0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
195d0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
195e0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
195f0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
19600 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
19610 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
19620 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
19630 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
19640 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
19650 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
19660 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
19670 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
19680 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
19690 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
196a0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
196b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
196c0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
196d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
196e0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
196f0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
19700 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
19710 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
19720 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
19730 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
19740 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
19750 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
19760 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72  = mPrereq | pTer
19770 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
19780 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
19790 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
197a0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
197b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
197c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
197d0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
197e0 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
197f0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
19800 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
19810 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
19820 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
19830 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
19840 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
19850 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
19860 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
19870 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
19880 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
19890 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
198a0 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  WC, pProbe->pPar
198b0 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20  tIdxWhere) ){.  
198c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
198d0 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e  ew->iTab!=pSrc->
198e0 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53  iCursor );  /* S
198f0 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37  ee ticket [98d97
19900 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20  3b8f5] */.      
19910 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61  continue;  /* Pa
19920 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70  rtial index inap
19930 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
19940 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  is query */.    
19950 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50  }.    rSize = pP
19960 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
19970 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  t[0];.    pNew->
19980 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b  u.btree.nEq = 0;
19990 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
199a0 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20 20 20  ee.nBtm = 0;.   
199b0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
199c0 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Top = 0;.    pNe
199d0 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  w->nSkip = 0;.  
199e0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
199f0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
19a00 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
19a10 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
19a20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
19a30 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 20 20  eq = mPrereq;.  
19a40 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
19a50 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
19a60 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
19a70 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
19a80 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
19a90 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
19aa0 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
19ab0 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
19ac0 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
19ad0 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
19ae0 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
19af0 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
19b00 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
19b10 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
19b20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
19b30 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
19b40 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
19b50 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
19b60 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
19b70 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
19b80 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
19b90 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
19ba0 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
19bb0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
19bc0 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
19bd0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
19be0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
19bf0 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
19c00 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
19c10 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
19c20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20 20 20  (N*3.0). */.    
19c30 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
19c40 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20 20 20  Size + 16;.     
19c50 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
19c60 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
19c70 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29   pTab->costMult)
19c80 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
19c90 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
19ca0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
19cb0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
19cc0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
19cd0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
19ce0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
19cf0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
19d00 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
19d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
19d20 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69  tmask m;.      i
19d30 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43 6f 76  f( pProbe->isCov
19d40 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  ering ){.       
19d50 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
19d60 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
19d70 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  | WHERE_INDEXED;
19d80 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30 3b 0a  .        m = 0;.
19d90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19da0 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d 3e 63       m = pSrc->c
19db0 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
19dc0 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
19dd0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19de0 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29  wsFlags = (m==0)
19df0 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   ? (WHERE_IDX_ON
19e00 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  LY|WHERE_INDEXED
19e10 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ) : WHERE_INDEXE
19e20 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  D;.      }..    
19e30 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
19e40 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
19e50 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
19e60 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  | !HasRowid(pTab
19e70 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 72 6f  ).       || pPro
19e80 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
19e90 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  e!=0.       || (
19ea0 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26   m==0.         &
19eb0 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64  & pProbe->bUnord
19ec0 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
19ed0 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49   && (pProbe->szI
19ee0 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
19ef0 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26  bRow).         &
19f00 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
19f10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
19f20 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
19f30 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
19f40 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19f50 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20  g.bUseCis.      
19f60 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
19f70 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f  onEnabled(pWInfo
19f80 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  ->pParse->db, SQ
19f90 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
19fa0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20  n).          ). 
19fb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
19fc0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
19fd0 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
19fe0 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
19ff0 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
1a000 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ing the index ro
1a010 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65  ws is N*K, where
1a020 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   K is.        **
1a030 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
1a040 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20   3.0, depending 
1a050 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
1a060 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20  sizes of the.   
1a070 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e       ** index an
1a080 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 2a 2f  d table rows. */
1a090 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1a0a0 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20  Run = rSize + 1 
1a0b0 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
1a0c0 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a  IdxRow)/pTab->sz
1a0d0 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  TabRow;.        
1a0e0 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20  if( m!=0 ){.    
1a0f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1a100 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69   is a non-coveri
1a110 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 61  ng index scan, a
1a120 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74 20 6f  dd in the cost o
1a130 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  f.          ** d
1a140 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  oing table looku
1a150 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20 77 69  ps.  The cost wi
1a160 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e 75 6d  ll be 3x the num
1a170 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
1a180 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 61   ** lookups.  Ta
1a190 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20  ke into account 
1a1a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1a1b0 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 0a 20  ms that can be. 
1a1c0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 74 69           ** sati
1a1d0 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75 73 74  sfied using just
1a1e0 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
1a1f0 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1a200 69 72 65 20 61 0a 20 20 20 20 20 20 20 20 20 20  ire a.          
1a210 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e  ** table lookup.
1a220 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c 6f   */.          Lo
1a230 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72  gEst nLookup = r
1a240 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a 20 42  Size + 16;  /* B
1a250 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33 20 2a  ase cost:  N*3 *
1a260 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
1a270 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ii;.          in
1a280 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
1a290 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
1a2a0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1a2b0 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  WC2 = &pWInfo->s
1a2c0 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  WC;.          fo
1a2d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43 32 2d  r(ii=0; ii<pWC2-
1a2e0 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
1a2f0 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
1a300 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
1a310 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  WC2->a[ii];.    
1a320 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
1a330 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
1a340 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 45  yIndex(pTerm->pE
1a350 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72 6f 62  xpr, iCur, pProb
1a360 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
1a370 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a390 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20 63 61       /* pTerm ca
1a3a0 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 75  n be evaluated u
1a3b0 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
1a3c0 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63 65 0a  dex.  So reduce.
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1a3e0 68 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62  he expected numb
1a3f0 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f 6f 6b  er of table look
1a400 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  ups accordingly 
1a410 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1a420 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
1a430 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
1a440 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 20          nLookup 
1a450 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
1a460 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rob;.           
1a470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a480 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b        nLookup--;
1a490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1a4a0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1a4b0 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1a4c0 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d  IS) ) nLookup -=
1a4d0 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20 20 20   19;.           
1a4e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1a4f0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
1a500 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1a510 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1a520 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c  d(pNew->rRun, nL
1a530 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20 20 20  ookup);.        
1a540 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
1a550 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
1a560 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
1a570 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
1a580 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
1a590 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
1a5a0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
1a5b0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1a5c0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a5d0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
1a5e0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
1a5f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1a600 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
1a610 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a620 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1a630 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
1a640 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
1a650 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  obe, 0);.#ifdef 
1a660 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1a670 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
1a680 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
1a690 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
1a6a0 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
1a6b0 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
1a6c0 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
1a6d0 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
1a6e0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
1a6f0 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
1a700 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
1a710 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
1a720 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
1a730 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
1a740 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
1a750 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  IBIndex ) break;
1a760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a770 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1a780 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1a790 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  TABLE../*.** Arg
1a7a0 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69  ument pIdxInfo i
1a7b0 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
1a7c0 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  ted with all con
1a7d0 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61  straints that ma
1a7e0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20  y.** be used by 
1a7f0 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a800 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
1a810 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
1a820 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75  iTab. This.** fu
1a830 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
1a840 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63  ubset of those c
1a850 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c  onstraints usabl
1a860 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a  e, invokes the.*
1a870 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  * xBestIndex met
1a880 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68 65  hod and adds the
1a890 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74   returned plan t
1a8a0 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  o pBuilder..**.*
1a8b0 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  * A constraint i
1a8c0 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20  s marked usable 
1a8d0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72  if:.**.**   * Ar
1a8e0 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69  gument mUsable i
1a8f0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74  ndicates that it
1a900 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  s prerequisites 
1a910 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61  are available, a
1a920 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20  nd.**.**   * It 
1a930 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68  is not one of th
1a940 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63  e operators spec
1a950 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78  ified in the mEx
1a960 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65  clude mask passe
1a970 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20  d.**     as the 
1a980 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1a990 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74 69  (which in practi
1a9a0 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f  ce is either WO_
1a9b0 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  IN or 0)..**.** 
1a9c0 41 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71  Argument mPrereq
1a9d0 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61   is a mask of ta
1a9e0 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1a9f0 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1aa00 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
1aa10 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
1aa20 6e 2e 20 54 68 65 73 65 20 61 72 65 20 61 64 64  n. These are add
1aa30 65 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20  ed to the plans 
1aa40 70 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a  prerequisites.**
1aa50 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 61 64   before it is ad
1aa60 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e  ded to pBuilder.
1aa70 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61  .**.** Output pa
1aa80 72 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73  rameter *pbIn is
1aa90 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
1aaa0 74 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74  the plan added t
1aab0 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73  o pBuilder.** us
1aac0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  es one or more W
1aad0 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66  O_IN terms, or f
1aae0 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
1aaf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1ab00 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1ab10 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  lOne(.  WhereLoo
1ab20 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1ab30 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  er,.  Bitmask mP
1ab40 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20  rereq,          
1ab50 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1ab60 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   tables that mus
1ab70 74 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20  t be used. */.  
1ab80 42 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c  Bitmask mUsable,
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c  /* Mask of usabl
1abb0 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31  e tables */.  u1
1abc0 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20  6 mExclude,     
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1abe0 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75   Exclude terms u
1abf0 73 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61  sing these opera
1ac00 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tors */.  sqlite
1ac10 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
1ac20 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70  dxInfo,   /* Pop
1ac30 75 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f  ulated object fo
1ac40 72 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  r xBestIndex */.
1ac50 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20    u16 mNoOmit,  
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac70 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74    /* Do not omit
1ac80 20 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69 6e   these constrain
1ac90 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49  ts */.  int *pbI
1aca0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1acb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1acc0 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65  True if plan use
1acd0 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20  s an IN(...) op 
1ace0 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61  */.){.  WhereCla
1acf0 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c  use *pWC = pBuil
1ad00 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75  der->pWC;.  stru
1ad10 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1ad20 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
1ad30 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
1ad40 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1ad50 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
1ad60 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
1ad70 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
1ad80 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  age;.  int i;.  
1ad90 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  int mxTerm;.  in
1ada0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1adb0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1adc0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1add0 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70  pNew;.  Parse *p
1ade0 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72  Parse = pBuilder
1adf0 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1ae00 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1ae10 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
1ae20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66  &pBuilder->pWInf
1ae30 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1ae40 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e  New->iTab];.  in
1ae50 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
1ae60 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
1ae70 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  raint;..  assert
1ae80 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72  ( (mUsable & mPr
1ae90 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29  ereq)==mPrereq )
1aea0 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20  ;.  *pbIn = 0;. 
1aeb0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
1aec0 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53  mPrereq;..  /* S
1aed0 65 74 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  et the usable fl
1aee0 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74  ag on the subset
1aef0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
1af00 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20  identified by . 
1af10 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55   ** arguments mU
1af20 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75  sable and mExclu
1af30 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  de. */.  pIdxCon
1af40 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
1af50 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1af60 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
1af70 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
1af80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1af90 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
1afa0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
1afb0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1afc0 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43   = &pWC->a[pIdxC
1afd0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
1afe0 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
1aff0 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
1b000 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1b010 72 65 71 52 69 67 68 74 20 26 20 6d 55 73 61 62  reqRight & mUsab
1b020 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72  le)==pTerm->prer
1b030 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 26 26  eqRight .     &&
1b040 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1b050 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d  or & mExclude)==
1b060 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1b070 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
1b080 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1b090 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1b0a0 74 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64  the output field
1b0b0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
1b0c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
1b0d0 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  cture */.  memse
1b0e0 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
1b0f0 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e  eof(pUsage[0])*n
1b100 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61  Constraint);.  a
1b110 73 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d  ssert( pIdxInfo-
1b120 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1b130 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e  r==0 );.  pIdxIn
1b140 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
1b150 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
1b160 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  um = 0;.  pIdxIn
1b170 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1b180 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  med = 0;.  pIdxI
1b190 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1b1a0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
1b1b0 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
1b1c0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
1b1d0 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b  imatedRows = 25;
1b1e0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
1b1f0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64  Flags = 0;.  pId
1b200 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d  xInfo->colUsed =
1b210 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1b220 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a  pSrc->colUsed;..
1b230 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
1b240 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42  virtual table xB
1b250 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1b260 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62  d */.  rc = vtab
1b270 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
1b280 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49  , pSrc->pTab, pI
1b290 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72  dxInfo);.  if( r
1b2a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
1b2b0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
1b2c0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
1b2d0 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69  LSlot>=nConstrai
1b2e0 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt );.  for(i=0;
1b2f0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b300 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72  i++) pNew->aLTer
1b310 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  m[i] = 0;.  pNew
1b320 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
1b330 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e  k = 0;.  pIdxCon
1b340 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
1b350 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1b360 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
1b370 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
1b380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1b390 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
1b3a0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
1b3b0 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 69  int iTerm;.    i
1b3c0 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61  f( (iTerm = pUsa
1b3d0 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
1b3e0 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  - 1)>=0 ){.     
1b3f0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1b400 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  m;.      int j =
1b410 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
1b420 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
1b430 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72  ( iTerm>=nConstr
1b440 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a  aint.       || j
1b450 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  <0.       || j>=
1b460 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
1b470 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
1b480 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
1b490 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d 3e     || pIdxCons->
1b4a0 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20  usable==0.      
1b4b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b4c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1b4d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1b4e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
1b4f0 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66  .xBestIndex malf
1b500 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70  unction",pSrc->p
1b510 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
1b520 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1b540 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e  stcase( iTerm==n
1b550 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a  Constraint-1 );.
1b560 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b570 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  j==0 );.      te
1b580 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e  stcase( j==pWC->
1b590 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20  nTerm-1 );.     
1b5a0 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
1b5b0 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  [j];.      pNew-
1b5c0 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d  >prereq |= pTerm
1b5d0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1b5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
1b5f0 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  rm<pNew->nLSlot 
1b600 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  );.      pNew->a
1b610 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70  LTerm[iTerm] = p
1b620 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  Term;.      if( 
1b630 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
1b640 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
1b650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1b660 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20  Term==15 );.    
1b670 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1b680 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 69  m==16 );.      i
1b690 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70  f( iTerm<16 && p
1b6a0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20  Usage[i].omit ) 
1b6b0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
1b6c0 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72  tMask |= 1<<iTer
1b6d0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  m;.      if( (pT
1b6e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b6f0 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
1b700 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75        /* A virtu
1b710 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  al table that is
1b720 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
1b730 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79  an IN clause may
1b740 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
1b750 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
1b760 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
1b770 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
1b780 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
1b790 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
1b7a0 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61  necessarily rela
1b7b0 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72  ted to the order
1b7c0 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73   of output terms
1b7d0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
1b7e0 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
1b7f0 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
1b800 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
1b810 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
1b820 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20     ** together. 
1b830 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78   */.        pIdx
1b840 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
1b850 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
1b860 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
1b870 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  Flags &= ~SQLITE
1b880 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51  _INDEX_SCAN_UNIQ
1b890 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 49  UE;.        *pbI
1b8a0 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20 28  n = 1; assert( (
1b8b0 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49 4e  mExclude & WO_IN
1b8c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  )==0 );.      }.
1b8d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
1b8e0 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
1b8f0 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a  k &= ~mNoOmit;..
1b900 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1b910 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 61 73 73   mxTerm+1;.  ass
1b920 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
1b930 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
1b940 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  );.  pNew->u.vta
1b950 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
1b960 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 70  nfo->idxNum;.  p
1b970 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1b980 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
1b990 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1b9a0 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  r;.  pIdxInfo->n
1b9b0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1b9c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1b9d0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
1b9e0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
1b9f0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
1ba00 4f 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70  Ordered = (i8)(p
1ba10 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1ba20 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20  Consumed ?.     
1ba30 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
1ba40 72 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  rBy : 0);.  pNew
1ba50 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1ba60 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
1ba70 69 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f  ite3LogEstFromDo
1ba80 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65  uble(pIdxInfo->e
1ba90 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
1baa0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
1bab0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78  lite3LogEst(pIdx
1bac0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
1bad0 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ows);..  /* Set 
1bae0 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
1baf0 20 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65   flag if the xBe
1bb00 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64  stIndex() method
1bb10 20 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a 20   indicated.  ** 
1bb20 74 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69  that the scan wi
1bb30 6c 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73 74  ll visit at most
1bb40 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72 20   one row. Clear 
1bb50 69 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f  it otherwise. */
1bb60 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
1bb70 3e 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c 49  >idxFlags & SQLI
1bb80 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e  TE_INDEX_SCAN_UN
1bb90 49 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65 77  IQUE ){.    pNew
1bba0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
1bbb0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c  RE_ONEROW;.  }el
1bbc0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  se{.    pNew->ws
1bbd0 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
1bbe0 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 63  ONEROW;.  }.  rc
1bbf0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
1bc00 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
1bc10 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  w);.  if( pNew->
1bc20 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1bc30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1bc40 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ree(pNew->u.vtab
1bc50 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 4e  .idxStr);.    pN
1bc60 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1bc70 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 57  ree = 0;.  }.  W
1bc80 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
1bc90 2c 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72 65  , ("  bIn=%d pre
1bca0 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72 65  reqIn=%04llx pre
1bcb0 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e 22  reqOut=%04llx\n"
1bcc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bcd0 20 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20 28          *pbIn, (
1bce0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d  sqlite3_uint64)m
1bcf0 50 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  Prereq,.        
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1bd10 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28 70  qlite3_uint64)(p
1bd20 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1bd30 50 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72 65  Prereq)));..  re
1bd40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1bd50 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
1bd60 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
1bd70 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
1bd80 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20  join identified 
1bd90 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e  by.** pBuilder->
1bda0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
1bdb0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
1bdc0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69  nteed to be a vi
1bdd0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
1bde0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1bdf0 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53  no LEFT or CROSS
1be00 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74   JOIN joins in t
1be10 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d  he query, both m
1be20 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55  Prereq and.** mU
1be30 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65 74 20  nusable are set 
1be40 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c  to 0. Otherwise,
1be50 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61   mPrereq is a ma
1be60 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63  sk of all FROM c
1be70 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73  lause.** entries
1be80 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
1be90 72 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  re the virtual t
1bea0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
1beb0 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a   clause and are.
1bec0 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  ** separated fro
1bed0 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74  m it by at least
1bee0 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f   one LEFT or CRO
1bef0 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72  SS JOIN. Similar
1bf00 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73  ly, the.** mUnus
1bf10 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  able mask contai
1bf20 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  ns all FROM clau
1bf30 73 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  se entries that 
1bf40 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a  occur after the.
1bf50 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1bf60 20 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74   and are separat
1bf70 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1bf80 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1bf90 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49  or .** CROSS JOI
1bfa0 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  N. .**.** For ex
1bfb0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
1bfc0 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  ery were:.**.** 
1bfd0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74    ... FROM t1, t
1bfe0 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20  2 LEFT JOIN t3, 
1bff0 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49  t4, vt CROSS JOI
1c000 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20  N t5, t6;.**.** 
1c010 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f 72  then mPrereq cor
1c020 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c  responds to (t1,
1c030 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62   t2) and mUnusab
1c040 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a  le to (t5, t6)..
1c050 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61  **.** All the ta
1c060 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71 20  bles in mPrereq 
1c070 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1c080 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
1c090 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74  nt virtual .** t
1c0a0 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72  able. So any ter
1c0b0 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c  ms for which all
1c0c0 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
1c0d0 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
1c0e0 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79 20  .** mPrereq may 
1c0f0 62 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  be specified as 
1c100 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20  "usable" in all 
1c110 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e  calls to xBestIn
1c120 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73  dex. .** Convers
1c130 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ely, all tables 
1c140 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73  in mUnusable mus
1c150 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74  t be scanned aft
1c160 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  er the current.*
1c170 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  * virtual table,
1c180 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   so any terms fo
1c190 72 20 77 68 69 63 68 20 74 68 65 20 70 72 65 72  r which the prer
1c1a0 65 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c 61  equisites overla
1c1b0 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61  p with.** mUnusa
1c1c0 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ble should alway
1c1d0 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20  s be configured 
1c1e0 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20  as "not-usable" 
1c1f0 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e 0a  for xBestIndex..
1c200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1c210 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1c220 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
1c230 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
1c240 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
1c250 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
1c260 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
1c270 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eq,             
1c280 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
1c290 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1c2a0 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 2a  efore this one *
1c2b0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75  /.  Bitmask mUnu
1c2c0 73 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20  sable           
1c2d0 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
1c2e0 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1c2f0 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20 2a  after this one *
1c300 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1c310 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1c320 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1c330 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  de */.  WhereInf
1c340 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
1c350 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
1c360 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
1c370 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
1c380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c390 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1c3a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1c3b0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
1c3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c3d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1c3e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1c3f0 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
1c400 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1c410 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
1c420 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  h */.  sqlite3_i
1c430 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20  ndex_info *p;   
1c440 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
1c450 20 70 61 73 73 20 74 6f 20 78 42 65 73 74 49 6e   pass to xBestIn
1c460 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  dex() */.  int n
1c470 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
1c480 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c490 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
1c4a0 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62   in p */.  int b
1c4b0 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
1c4c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1c4d0 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e 28  if plan uses IN(
1c4e0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ...) operator */
1c4f0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1c500 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42  ew;.  Bitmask mB
1c510 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
1c520 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73 65     /* Tables use
1c530 64 20 62 79 20 62 65 73 74 20 70 6f 73 73 69 62  d by best possib
1c540 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36  le plan */.  u16
1c550 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73   mNoOmit;..  ass
1c560 65 72 74 28 20 28 6d 50 72 65 72 65 71 20 26 20  ert( (mPrereq & 
1c570 6d 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b  mUnusable)==0 );
1c580 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
1c590 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1c5a0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
1c5b0 3e 70 50 61 72 73 65 3b 0a 20 20 70 57 43 20 3d  >pParse;.  pWC =
1c5c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1c5d0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
1c5e0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20  r->pNew;.  pSrc 
1c5f0 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
1c600 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61  ist->a[pNew->iTa
1c610 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73  b];.  assert( Is
1c620 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
1c630 61 62 29 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c  ab) );.  p = all
1c640 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
1c650 50 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75  Parse, pWC, mUnu
1c660 73 61 62 6c 65 2c 20 70 53 72 63 2c 20 70 42 75  sable, pSrc, pBu
1c670 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c  ilder->pOrderBy,
1c680 20 0a 20 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74   .      &mNoOmit
1c690 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1c6a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1c6b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77  MEM_BKPT;.  pNew
1c6c0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1c6d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1c6e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1c6f0 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  LE;.  pNew->nLTe
1c700 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  rm = 0;.  pNew->
1c710 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1c720 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69  = 0;.  nConstrai
1c730 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61  nt = p->nConstra
1c740 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65  int;.  if( where
1c750 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73  LoopResize(pPars
1c760 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f  e->db, pNew, nCo
1c770 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20  nstraint) ){.   
1c780 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1c790 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20  Parse->db, p);. 
1c7a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c7b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
1c7c0 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c  ..  /* First cal
1c7d0 6c 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77  l xBestIndex() w
1c7e0 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ith all constrai
1c7f0 6e 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20  nts usable. */. 
1c800 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1c810 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1c820 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29  : all usable\n")
1c830 29 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c  );.  rc = whereL
1c840 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1c850 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1c860 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20  eq, ALLBITS, 0, 
1c870 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e  p, mNoOmit, &bIn
1c880 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1c890 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49 6e 64  call to xBestInd
1c8a0 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 74 65  ex() with all te
1c8b0 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72 6f 64  rms enabled prod
1c8c0 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a  uced a plan.  **
1c8d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1c8e0 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75 72 63  equire any sourc
1c8f0 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a 20 61  e tables (IOW: a
1c900 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65 73 74   plan with mBest
1c910 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ==0),.  ** then 
1c920 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
1c930 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e 79 20  t in making any 
1c940 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
1c950 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 0a 20   xBestIndex() . 
1c960 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 79 20 77   ** since they w
1c970 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e 20 74  ill all return t
1c980 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 28  he same result (
1c990 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  if the xBestInde
1c9a0 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65  x().  ** impleme
1c9b0 6e 74 61 74 69 6f 6e 20 69 73 20 73 61 6e 65 29  ntation is sane)
1c9c0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1c9d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d 42 65  QLITE_OK && (mBe
1c9e0 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72  st = (pNew->prer
1c9f0 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 21  eq & ~mPrereq))!
1ca00 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  =0 ){.    int se
1ca10 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20  enZero = 0;     
1ca20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ca30 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6e  if a plan with n
1ca40 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e 20 2a  o prereqs seen *
1ca50 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65  /.    int seenZe
1ca60 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20  roNoIN = 0;     
1ca70 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68      /* Plan with
1ca80 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e 64 20   no prereqs and 
1ca90 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20  no IN(...) seen 
1caa0 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  */.    Bitmask m
1cab0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 42 69  Prev = 0;.    Bi
1cac0 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20  tmask mBestNoIn 
1cad0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
1cae0 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75 63 65  the plan produce
1caf0 64 20 62 79 20 74 68 65 20 65 61 72 6c 69 65 72  d by the earlier
1cb00 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e   call uses an IN
1cb10 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c  (...) term, call
1cb20 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49 6e 64  .    ** xBestInd
1cb30 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73 20 74  ex again, this t
1cb40 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29  ime with IN(...)
1cb50 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65 64 2e   terms disabled.
1cb60 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 6e 20   */.    if( bIn 
1cb70 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1cb80 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1cb90 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73  rtualOne: all us
1cba0 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29  able w/o IN\n"))
1cbb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1cbc0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1cbd0 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1cbe0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1cbf0 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e  , ALLBITS, WO_IN
1cc00 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1cc10 49 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  In);.      asser
1cc20 74 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20  t( bIn==0 );.   
1cc30 20 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70     mBestNoIn = p
1cc40 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1cc50 50 72 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66  Prereq;.      if
1cc60 28 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29  ( mBestNoIn==0 )
1cc70 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65  {.        seenZe
1cc80 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
1cc90 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1cca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ccb0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65  .    /* Call xBe
1ccc0 73 74 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72  stIndex once for
1ccd0 20 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 76   each distinct v
1cce0 61 6c 75 65 20 6f 66 20 28 70 72 65 72 65 71 52  alue of (prereqR
1ccf0 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29  ight & ~mPrereq)
1cd00 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20   .    ** in the 
1cd10 73 65 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61  set of terms tha
1cd20 74 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63  t apply to the c
1cd30 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74  urrent virtual t
1cd40 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68  able.  */.    wh
1cd50 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1cd60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1cd70 69 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  i;.      Bitmask
1cd80 20 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53   mNext = ALLBITS
1cd90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cda0 6d 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20  mNext>0 );.     
1cdb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
1cdc0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
1cdd0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
1cde0 54 68 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20  This = (.       
1cdf0 20 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61       pWC->a[p->a
1ce00 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
1ce10 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65  ermOffset].prere
1ce20 71 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65  qRight & ~mPrere
1ce30 71 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  q.        );.   
1ce40 20 20 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d       if( mThis>m
1ce50 50 72 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e  Prev && mThis<mN
1ce60 65 78 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54  ext ) mNext = mT
1ce70 68 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  his;.      }.   
1ce80 20 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74     mPrev = mNext
1ce90 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78  ;.      if( mNex
1cea0 74 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65  t==ALLBITS ) bre
1ceb0 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e  ak;.      if( mN
1cec0 65 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e  ext==mBest || mN
1ced0 65 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29  ext==mBestNoIn )
1cee0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1cef0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1cf00 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1cf10 3a 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d  : mPrev=%04llx m
1cf20 4e 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a  Next=%04llx\n",.
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1cf50 75 69 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73  uint64)mPrev, (s
1cf60 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e  qlite3_uint64)mN
1cf70 65 78 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20  ext));.      rc 
1cf80 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1cf90 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1cfa0 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1cfb0 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72  rereq, mNext|mPr
1cfc0 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  ereq, 0, p, mNoO
1cfd0 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  mit, &bIn);.    
1cfe0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72    if( pNew->prer
1cff0 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20  eq==mPrereq ){. 
1d000 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20         seenZero 
1d010 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
1d020 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65   bIn==0 ) seenZe
1d030 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1d040 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d050 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74  * If the calls t
1d060 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 69  o xBestIndex() i
1d070 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70  n the above loop
1d080 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
1d090 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74  plan.    ** that
1d0a0 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75   requires no sou
1d0b0 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c  rce tables at al
1d0c0 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72  l (i.e. one guar
1d0d0 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20 20 20  anteed to be.   
1d0e0 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b   ** usable), mak
1d0f0 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20 77 69  e a call here wi
1d100 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61  th all source ta
1d110 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  bles disabled */
1d120 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d130 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65  ITE_OK && seenZe
1d140 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  ro==0 ){.      W
1d150 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1d160 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1d170 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e 22 29  all disabled\n")
1d180 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1d190 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1d1a0 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20  lOne(.          
1d1b0 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1d1c0 71 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70  q, mPrereq, 0, p
1d1d0 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d1e0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d  ;.      if( bIn=
1d1f0 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49  =0 ) seenZeroNoI
1d200 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  N = 1;.    }..  
1d210 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
1d220 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  s to xBestIndex(
1d230 29 20 68 61 76 65 20 73 6f 20 66 61 72 20 66 61  ) have so far fa
1d240 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70  iled to find a p
1d250 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  lan.    ** that 
1d260 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72  requires no sour
1d270 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c  ce tables at all
1d280 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73   and does not us
1d290 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20  e an IN(...).   
1d2a0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61   ** operator, ma
1d2b0 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20  ke a final call 
1d2c0 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65  to obtain one he
1d2d0 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  re.  */.    if( 
1d2e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d2f0 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30   seenZeroNoIN==0
1d300 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
1d310 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1d320 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64  irtualOne: all d
1d330 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20  isabled and w/o 
1d340 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  IN\n"));.      r
1d350 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1d360 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1d370 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1d380 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71  mPrereq, mPrereq
1d390 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f  , WO_IN, p, mNoO
1d3a0 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  mit, &bIn);.    
1d3b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
1d3c0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1d3d0 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
1d3e0 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
1d3f0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1d400 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 72 65  se->db, p);.  re
1d410 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1d420 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1d430 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1d440 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
1d450 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
1d460 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
1d470 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
1d480 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
1d490 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
1d4a0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1d4b0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1d4c0 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  Or(.  WhereLoopB
1d4d0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1d4e0 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  , .  Bitmask mPr
1d4f0 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61 73 6b  ereq, .  Bitmask
1d500 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20   mUnusable.){.  
1d510 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1d520 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
1d530 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
1d540 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
1d550 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
1d560 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
1d570 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
1d580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d590 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
1d5a0 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
1d5b0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
1d5c0 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
1d5d0 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53 75    WhereOrSet sSu
1d5e0 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75 63  m, sCur;.  struc
1d5f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d600 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20  pItem;.  .  pWC 
1d610 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b  = pBuilder->pWC;
1d620 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  .  pWCEnd = pWC-
1d630 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
1d640 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1d650 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73  er->pNew;.  mems
1d660 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a  et(&sSum, 0, siz
1d670 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70 49  eof(sSum));.  pI
1d680 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
1d690 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77  abList->a + pNew
1d6a0 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20 3d  ->iTab;.  iCur =
1d6b0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
1d6c0 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
1d6d0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
1d6e0 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
1d6f0 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
1d700 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1d710 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
1d720 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
1d730 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
1d740 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
1d750 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
1d760 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
1d770 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
1d780 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
1d790 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
1d7a0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1d7b0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
1d7c0 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
1d7d0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
1d7e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
1d7f0 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
1d800 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  once = 1;.      
1d810 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20  int i, j;.    . 
1d820 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d       sSubBuild =
1d830 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20   *pBuilder;.    
1d840 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64    sSubBuild.pOrd
1d850 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
1d860 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65 74  sSubBuild.pOrSet
1d870 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20 20   = &sCur;..     
1d880 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1d890 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63 65  0, ("Begin proce
1d8a0 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
1d8b0 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
1d8c0 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
1d8d0 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
1d8e0 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
1d8f0 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
1d900 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
1d910 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
1d920 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
1d930 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
1d940 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
1d950 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
1d960 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d970 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
1d980 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
1d990 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57         tempWC.pW
1d9a0 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
1d9b0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  fo;.          te
1d9c0 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
1d9d0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
1d9e0 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
1d9f0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1da00 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
1da10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
1da20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
1da30 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1da40 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20  WC = &tempWC;.  
1da50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1da60 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1da70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1da80 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23     sCur.n = 0;.#
1da90 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
1daa0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20  _ENABLED.       
1dab0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1dac0 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64 20  0, ("OR-term %d 
1dad0 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75 62  of %p has %d sub
1dae0 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20  terms:\n", .    
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1db00 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72  int)(pOrTerm-pOr
1db10 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73  WC->a), pTerm, s
1db20 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54  SubBuild.pWC->nT
1db30 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69  erm));.        i
1db40 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
1db50 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
1db60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1db70 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
1db80 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57 43 29  t(sSubBuild.pWC)
1db90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
1dba0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
1dbb0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1dbc0 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  BLE.        if( 
1dbd0 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
1dbe0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1dbf0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1dc00 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
1dc10 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71  ubBuild, mPrereq
1dc20 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1dc30 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
1dc40 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
1dc50 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1dc60 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
1dc70 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65  SubBuild, mPrere
1dc80 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  q);.        }.  
1dc90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1dca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dcb0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1dcc0 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42 75  oopAddOr(&sSubBu
1dcd0 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  ild, mPrereq, mU
1dce0 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  nusable);.      
1dcf0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1dd00 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1dd10 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29  K || sCur.n==0 )
1dd20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
1dd30 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ur.n==0 ){.     
1dd40 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
1dd50 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1dd60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1dd70 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
1dd80 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1dd90 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b  e(&sSum, &sCur);
1dda0 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20  .          once 
1ddb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1ddc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68  se{.          Wh
1ddd0 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a  ereOrSet sPrev;.
1dde0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1ddf0 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73  rMove(&sPrev, &s
1de00 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sum);.          
1de10 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
1de20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1de30 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a  <sPrev.n; i++){.
1de40 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1de50 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a  j=0; j<sCur.n; j
1de60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1de70 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
1de80 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b  (&sSum, sPrev.a[
1de90 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72  i].prereq | sCur
1dea0 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20  .a[j].prereq,.  
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ded0 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1dee0 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72  .a[i].rRun, sCur
1def0 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20  .a[j].rRun),.   
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1df20 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
1df30 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
1df40 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
1df50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1df60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1df70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1df80 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
1df90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
1dfa0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
1dfb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1dfc0 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
1dfd0 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
1dfe0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
1dff0 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
1e000 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
1e010 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
1e020 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
1e030 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
1e040 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
1e050 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
1e060 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
1e070 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79  UNING: Currently
1e080 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
1e090 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75  is set to the su
1e0a0 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  m of the costs. 
1e0b0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c         ** of all
1e0c0 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69   sub-scans requi
1e0d0 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63  red by the OR-sc
1e0e0 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65  an. However, due
1e0f0 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20   to rounding.   
1e100 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20       ** errors, 
1e110 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74  it may be that t
1e120 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f  he cost of the O
1e130 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20  R-scan is equal 
1e140 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a  to its.        *
1e150 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65  * most expensive
1e160 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74   sub-scan. Add t
1e170 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73  he smallest poss
1e180 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20  ible penalty .  
1e190 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61        ** (equiva
1e1a0 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79  lent to multiply
1e1b0 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79 20  ing the cost by 
1e1c0 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20  1.07) to ensure 
1e1d0 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  that .        **
1e1e0 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68   this does not h
1e1f0 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65  appen. Otherwise
1e200 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  , for WHERE clau
1e210 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65 0a  ses such as the.
1e220 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
1e230 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72 65  wing where there
1e240 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1e250 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  "y":.        **.
1e260 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57          **     W
1e270 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
1e280 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d  x=?, 0.99) OR y=
1e290 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ?.        **.   
1e2a0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e       ** the plan
1e2b0 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f  ner may elect to
1e2c0 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61   "OR" together a
1e2d0 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
1e2e0 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20   and an.        
1e2f0 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e  ** index lookup.
1e300 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c   And other simil
1e310 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73  arly odd results
1e320 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
1e330 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
1e340 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20  a[i].rRun + 1;. 
1e350 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1e360 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f  t = sSum.a[i].nO
1e370 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ut;.        pNew
1e380 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e  ->prereq = sSum.
1e390 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20  a[i].prereq;.   
1e3a0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1e3b0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
1e3c0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
1e3d0 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
1e3e0 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64  ACE(0x200, ("End
1e3f0 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63   processing OR-c
1e400 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65  lause %p\n", pTe
1e410 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rm));.    }.  }.
1e420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e430 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
1e440 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
1e450 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a  for all tables .
1e460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1e470 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68  ereLoopAddAll(Wh
1e480 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1e490 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
1e4a0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
1e4b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1e4c0 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  o;.  Bitmask mPr
1e4d0 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69 74 6d  ereq = 0;.  Bitm
1e4e0 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a  ask mPrior = 0;.
1e4f0 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72    int iTab;.  Sr
1e500 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
1e510 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1e520 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1e530 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e540 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1e550 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20  st_item *pEnd = 
1e560 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49  &pTabList->a[pWI
1e570 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  nfo->nLevel];.  
1e580 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1e590 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1e5a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1e5b0 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
1e5c0 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20  oop *pNew;.  u8 
1e5d0 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1e5e0 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  0;..  /* Loop ov
1e5f0 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
1e600 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
1e610 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
1e620 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
1e630 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
1e640 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
1e650 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
1e660 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
1e670 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54  ; pItem<pEnd; iT
1e680 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
1e690 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75      Bitmask mUnu
1e6a0 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70  sable = 0;.    p
1e6b0 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
1e6c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
1e6d0 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68  Self = sqlite3Wh
1e6e0 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
1e6f0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49  fo->sMaskSet, pI
1e700 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1e710 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e     if( ((pItem->
1e720 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  fg.jointype|prio
1e730 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a 54  rJointype) & (JT
1e740 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
1e750 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1e760 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
1e770 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74 65  s true when pIte
1e780 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63 6c  m is the FROM cl
1e790 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68 65  ause term on the
1e7a0 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2d  .      ** right-
1e7b0 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 4c  hand-side of a L
1e7c0 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1e7d0 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72  N.  */.      mPr
1e7e0 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  ereq = mPrior;. 
1e7f0 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
1e800 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  intype = pItem->
1e810 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66  fg.jointype;.#if
1e820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e830 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1e840 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1e850 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
1e860 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1e870 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20  List_item *p;.  
1e880 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65 6d      for(p=&pItem
1e890 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [1]; p<pEnd; p++
1e8a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ){.        if( m
1e8b0 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e  Unusable || (p->
1e8c0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a  fg.jointype & (J
1e8d0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
1e8e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
1e8f0 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69  Unusable |= sqli
1e900 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1e910 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
1e920 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  t, p->iCursor);.
1e930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e940 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  }.      rc = whe
1e950 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1e960 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1e970 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1e980 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1e990 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1e9a0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
1e9b0 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d      {.      rc =
1e9c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
1e9d0 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  ee(pBuilder, mPr
1e9e0 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ereq);.    }.   
1e9f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ea00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1ea10 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1ea20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1ea30 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1ea40 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20     }.    mPrior 
1ea50 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  |= pNew->maskSel
1ea60 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  f;.    if( rc ||
1ea70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1ea80 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  d ) break;.  }..
1ea90 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
1eaa0 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
1eab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1eac0 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
1ead0 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
1eae0 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
1eaf0 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
1eb00 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
1eb10 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
1eb20 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
1eb30 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
1eb40 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
1eb50 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
1eb60 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
1eb70 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74   a separate sort
1eb80 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74   operation.  Ret
1eb90 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  urn N:.** .**   
1eba0 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f  N>0:   N terms o
1ebb0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1ebc0 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66  lause are satisf
1ebd0 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20  ied.**   N==0:  
1ebe0 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  No terms of the 
1ebf0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1ec00 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
1ec10 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77     N<0:   Unknow
1ec20 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74  n yet how many t
1ec30 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59  erms of ORDER BY
1ec40 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66   might be satisf
1ec50 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ied.   .**.** No
1ec60 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69  te that processi
1ec70 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f  ng for WHERE_GRO
1ec80 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44  UPBY and WHERE_D
1ec90 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74  ISTINCTBY is not
1eca0 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20   as.** strict.  
1ecb0 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e  With GROUP BY an
1ecc0 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f  d DISTINCT the o
1ecd0 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20  nly requirement 
1ece0 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76  is that.** equiv
1ecf0 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61  alent rows appea
1ed00 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64  r immediately ad
1ed10 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e  jacent to one an
1ed20 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59  other.  GROUP BY
1ed30 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54  .** and DISTINCT
1ed40 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1ed50 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69  rows to appear i
1ed60 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  n any particular
1ed70 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a   order as long.*
1ed80 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * as equivalent 
1ed90 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64  rows are grouped
1eda0 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73   together.  Thus
1edb0 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e   for GROUP BY an
1edc0 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68  d DISTINCT.** th
1edd0 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  e pOrderBy terms
1ede0 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20   can be matched 
1edf0 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57  in any order.  W
1ee00 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68  ith ORDER BY, th
1ee10 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74  e .** pOrderBy t
1ee20 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74  erms must be mat
1ee30 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c  ched in strict l
1ee40 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64  eft-to-right ord
1ee50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38  er..*/.static i8
1ee60 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
1ee70 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
1ee80 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1ee90 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1eea0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1eeb0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
1eec0 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
1eed0 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
1eee0 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
1eef0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
1ef00 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
1ef10 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
1ef20 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
1ef30 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
1ef40 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f         /* WHERE_
1ef50 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53 54  GROUPBY or _DIST
1ef60 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45 52  INCTBY or _ORDER
1ef70 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75 31  BY_LIMIT */.  u1
1ef80 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  6 nLoop,        
1ef90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1efa0 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
1efb0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
1efc0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
1efd0 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
1efe0 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
1eff0 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
1f000 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
1f010 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
1f020 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
1f030 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74   of WhereLoops t
1f040 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65  o run in reverse
1f050 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75   order */.){.  u
1f060 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20  8 revSet;       
1f070 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f080 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a  rev is known */.
1f090 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20    u8 rev;       
1f0a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f          /* Compo
1f0b0 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20  site sort order 
1f0c0 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20  */.  u8 revIdx; 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1f0e0 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  dex sort order *
1f0f0 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69  /.  u8 isOrderDi
1f100 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c  stinct;   /* All
1f110 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
1f120 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74  s are order-dist
1f130 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73  inct */.  u8 dis
1f140 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20  tinctColumns;   
1f150 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c  /* True if the l
1f160 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e  oop has UNIQUE N
1f170 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
1f180 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b  */.  u8 isMatch;
1f190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43             /* iC
1f1a0 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20  olumn matches a 
1f1b0 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
1f1c0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1f1d0 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20 20   u16 eqOpMask;  
1f1e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65         /* Allowe
1f1f0 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
1f200 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e 4b  tors */.  u16 nK
1f210 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  eyCol;          
1f220 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
1f230 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
1f240 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  ex */.  u16 nCol
1f250 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1f260 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1f270 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73   ordered columns
1f280 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
1f290 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b  .  u16 nOrderBy;
1f2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f2b0 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  er terms in the 
1f2c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1f2d0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
1f2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1f2f0 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  dex of WhereLoop
1f300 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20   in pPath being 
1f310 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69  processed */.  i
1f320 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1f330 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1f340 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
1f350 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1f360 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
1f370 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68  r for current Wh
1f380 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ereLoop */.  int
1f390 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1f3a0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e     /* A column n
1f3b0 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62  umber within tab
1f3c0 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65  le iCur */.  Whe
1f3d0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20  reLoop *pLoop = 
1f3e0 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68  0; /* Current Wh
1f3f0 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72  ereLoop being pr
1f400 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68  ocessed. */.  Wh
1f410 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1f420 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1f430 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1f440 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1f450 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20  pr *pOBExpr;    
1f460 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73      /* An expres
1f470 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52  sion from the OR
1f480 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1f490 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1f4a0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c  l;       /* COLL
1f4b0 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  ATE function fro
1f4c0 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  m an ORDER BY cl
1f4d0 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49  ause term */.  I
1f4e0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1f4f0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1f500 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1f510 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  h pLoop */.  sql
1f520 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1f530 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20  o->pParse->db;  
1f540 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1f550 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  ection */.  Bitm
1f560 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20  ask obSat = 0;  
1f570 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
1f580 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69  ER BY terms sati
1f590 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  sfied so far */.
1f5a0 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65    Bitmask obDone
1f5b0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ;       /* Mask 
1f5c0 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20  of all ORDER BY 
1f5d0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
1f5e0 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  sk orderDistinct
1f5f0 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f  Mask;  /* Mask o
1f600 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72  f all well-order
1f610 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69  ed loops */.  Bi
1f620 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20  tmask ready;    
1f630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1f640 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  k of inner loops
1f650 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57   */..  /*.  ** W
1f660 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
1f670 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
1f680 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
1f690 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1f6a0 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
1f6b0 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
1f6c0 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
1f6d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1f6e0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1f6f0 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
1f700 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
1f710 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
1f720 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
1f730 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
1f740 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
1f750 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
1f760 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1f770 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
1f780 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
1f790 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
1f7a0 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
1f7b0 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
1f7c0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
1f7d0 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
1f7e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
1f7f0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1f800 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
1f810 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
1f820 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
1f830 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
1f840 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
1f850 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1f860 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
1f870 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
1f880 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
1f890 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
1f8a0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
1f8b0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
1f8c0 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
1f8d0 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
1f8e0 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
1f8f0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
1f900 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
1f910 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
1f920 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
1f930 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
1f940 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
1f950 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
1f960 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
1f970 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
1f980 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
1f990 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1f9a0 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
1f9b0 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
1f9c0 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
1f9d0 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
1f9e0 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
1f9f0 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
1fa00 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
1fa10 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
1fa20 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
1fa30 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
1fa40 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
1fa50 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
1fa60 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
1fa70 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
1fa80 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
1fa90 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
1faa0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1fab0 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
1fac0 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
1fad0 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
1fae0 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
1faf0 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
1fb00 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
1fb10 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20   );.  if( nLoop 
1fb20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
1fb30 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1fb40 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
1fb50 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
1fb60 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
1fb70 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
1fb80 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72  testcase( nOrder
1fb90 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  By==BMS-1 );.  i
1fba0 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d  f( nOrderBy>BMS-
1fbb0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  1 ) return 0;  /
1fbc0 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a  * Cannot optimiz
1fbd0 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f  e overly large O
1fbe0 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73  RDER BYs */.  is
1fbf0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1fc00 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41  1;.  obDone = MA
1fc10 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d  SKBIT(nOrderBy)-
1fc20 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e  1;.  orderDistin
1fc30 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65  ctMask = 0;.  re
1fc40 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70 4d  ady = 0;.  eqOpM
1fc50 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57 4f  ask = WO_EQ | WO
1fc60 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b  _IS | WO_ISNULL;
1fc70 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67  .  if( wctrlFlag
1fc80 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
1fc90 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d 61  Y_LIMIT ) eqOpMa
1fca0 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66  sk |= WO_IN;.  f
1fcb0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
1fcc0 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
1fcd0 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
1fce0 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
1fcf0 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  op++){.    if( i
1fd00 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c  Loop>0 ) ready |
1fd10 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
1fd20 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  f;.    if( iLoop
1fd30 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  <nLoop ){.      
1fd40 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e 61  pLoop = pPath->a
1fd50 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
1fd60 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
1fd70 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
1fd80 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69 6e  Y_LIMIT ) contin
1fd90 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ue;.    }else{. 
1fda0 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 61       pLoop = pLa
1fdb0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  st;.    }.    if
1fdc0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1fdd0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
1fde0 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  TABLE ){.      i
1fdf0 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62  f( pLoop->u.vtab
1fe00 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53  .isOrdered ) obS
1fe10 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20  at = obDone;.   
1fe20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fe30 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
1fe40 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1fe50 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
1fe60 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
1fe70 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
1fe80 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
1fe90 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
1fea0 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
1feb0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
1fec0 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
1fed0 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
1fee0 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
1fef0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
1ff00 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
1ff10 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
1ff20 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
1ff30 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
1ff40 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1ff50 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
1ff60 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
1ff70 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
1ff80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ff90 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
1ffa0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1ffb0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
1ffc0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
1ffd0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
1ffe0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
1fff0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
20000 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
20010 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
20020 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73  .      pTerm = s
20030 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
20040 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
20050 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
20060 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 7e 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73   ~ready, eqOpMas
20090 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
200a0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
200b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
200c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
200d0 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  ==WO_IN ){.     
200e0 20 20 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61     /* IN terms a
200f0 72 65 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  re only valid fo
20100 72 20 73 6f 72 74 69 6e 67 20 69 6e 20 74 68 65  r sorting in the
20110 20 4f 52 44 45 52 20 42 59 20 4c 49 4d 49 54 20   ORDER BY LIMIT 
20120 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70 74 69  .        ** opti
20130 6d 69 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68  mization, and th
20140 65 6e 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 20  en only if they 
20150 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65  are actually use
20160 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  d.        ** by 
20170 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  the query plan *
20180 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
20190 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
201a0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
201b0 49 54 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  IT );.        fo
201c0 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e  r(j=0; j<pLoop->
201d0 6e 4c 54 65 72 6d 20 26 26 20 70 54 65 72 6d 21  nLTerm && pTerm!
201e0 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a  =pLoop->aLTerm[j
201f0 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ]; j++){}.      
20200 20 20 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e    if( j>=pLoop->
20210 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75  nLTerm ) continu
20220 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
20230 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
20240 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f  erator&(WO_EQ|WO
20250 5f 49 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45  _IS))!=0 && pOBE
20260 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
20270 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
20280 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a   char *z1, *z2;.
20290 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
202a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
202b0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
202c0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
202d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
202e0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
202f0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
20300 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31  Coll;.        z1
20310 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
20320 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
20330 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
20340 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
20350 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
20360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
20370 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
20380 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
20390 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c         z2 = pCol
203a0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
203b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
203c0 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20  ICmp(z1, z2)!=0 
203d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
203e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
203f0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
20400 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 7d  TK_IS );.      }
20410 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20  .      obSat |= 
20420 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
20430 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  }..    if( (pLoo
20440 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
20450 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b  RE_ONEROW)==0 ){
20460 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
20470 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
20480 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20  E_IPK ){.       
20490 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
204a0 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30       nKeyCol = 0
204b0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
204c0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 1;.      }el
204d0 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
204e0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
204f0 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
20500 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
20510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
20520 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
20530 65 7b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  e{.        nKeyC
20540 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  ol = pIndex->nKe
20550 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43  yCol;.        nC
20560 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
20570 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
20580 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
20590 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21  ==nKeyCol+1 || !
205a0 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
205b0 3e 70 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20  >pTable) );.    
205c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
205d0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
205e0 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49  lumn-1]==XN_ROWI
205f0 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D.              
20600 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21              || !
20610 48 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d  HasRowid(pIndex-
20620 3e 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  >pTable));.     
20630 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
20640 63 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64  ct = IsUniqueInd
20650 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ex(pIndex);.    
20660 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
20670 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
20680 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
20690 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
206a0 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
206b0 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
206c0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
206d0 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
206e0 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
206f0 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
20700 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
20710 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
20720 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20  j=0; j<nColumn; 
20730 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38  j++){.        u8
20740 20 62 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54   bOnce = 1; /* T
20750 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
20760 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
20770 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
20780 61 73 73 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70  assert( j>=pLoop
20790 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20  ->u.btree.nEq . 
207a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
207b0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d  Loop->aLTerm[j]=
207c0 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e  =0)==(j<pLoop->n
207d0 53 6b 69 70 29 0a 20 20 20 20 20 20 20 20 29 3b  Skip).        );
207e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
207f0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
20800 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e  q && j>=pLoop->n
20810 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
20820 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f    u16 eOp = pLoo
20830 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
20840 70 65 72 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20  perator;..      
20850 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
20860 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64 20 49   == and IS and I
20870 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41  SNULL terms.  (A
20880 6c 73 6f 20 73 6b 69 70 20 49 4e 20 74 65 72 6d  lso skip IN term
20890 73 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 20  s when.         
208a0 20 2a 2a 20 64 6f 69 6e 67 20 57 48 45 52 45 5f   ** doing WHERE_
208b0 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 70 72  ORDERBY_LIMIT pr
208c0 6f 63 65 73 73 69 6e 67 29 2e 20 0a 20 20 20 20  ocessing). .    
208d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
208e0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 63 75 72     ** If the cur
208f0 72 65 6e 74 20 74 65 72 6d 20 69 73 20 61 20 63  rent term is a c
20900 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c  olumn of an ((?,
20910 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e  ?) IN (SELECT...
20920 29 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  )) .          **
20930 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
20940 77 68 69 63 68 20 74 68 65 20 53 45 4c 45 43 54  which the SELECT
20950 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
20960 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20  an one column,. 
20970 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63           ** chec
20980 6b 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  k that it is the
20990 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65   only column use
209a0 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20  d by this loop. 
209b0 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
209c0 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 69 73       ** if it is
209d0 20 6f 6e 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d   one of two or m
209e0 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65  ore, none of the
209f0 20 63 6f 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a   columns can be.
20a00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
20a10 73 69 64 65 72 65 64 20 74 6f 20 6d 61 74 63 68  sidered to match
20a20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 74 65 72   an ORDER BY ter
20a30 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  m.  */.         
20a40 20 69 66 28 20 28 65 4f 70 20 26 20 65 71 4f 70   if( (eOp & eqOp
20a50 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
20a60 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20          if( eOp 
20a70 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
20a90 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
20aa0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
20ab0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
20ac0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
20ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20ae0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
20af0 20 20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c    .          }el
20b00 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 65 4f  se if( ALWAYS(eO
20b10 70 20 26 20 57 4f 5f 49 4e 29 20 29 7b 0a 20 20  p & WO_IN) ){.  
20b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4c 57            /* ALW
20b30 41 59 53 28 29 20 6a 75 73 74 69 66 69 63 61 74  AYS() justificat
20b40 69 6f 6e 3a 20 65 4f 70 20 69 73 20 61 6e 20 65  ion: eOp is an e
20b50 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
20b60 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 20 20   due to the.    
20b70 20 20 20 20 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f          ** j<pLo
20b80 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
20b90 63 6f 6e 73 74 72 61 69 6e 74 20 61 62 6f 76 65  constraint above
20ba0 2e 20 20 41 6e 79 20 65 71 75 61 6c 69 74 79 20  .  Any equality 
20bb0 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  other.          
20bc0 20 20 2a 2a 20 74 68 61 6e 20 57 4f 5f 49 4e 20    ** than WO_IN 
20bd0 69 73 20 63 61 70 74 75 72 65 64 20 62 79 20 74  is captured by t
20be0 68 65 20 70 72 65 76 69 6f 75 73 20 22 69 66 22  he previous "if"
20bf0 2e 20 20 53 6f 20 74 68 69 73 20 6f 6e 65 0a 20  .  So this one. 
20c00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c             ** al
20c10 77 61 79 73 20 68 61 73 20 74 6f 20 62 65 20 57  ways has to be W
20c20 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  O_IN. */.       
20c30 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
20c40 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
20c50 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
20c60 20 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31 3b 20       for(i=j+1; 
20c70 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  i<pLoop->u.btree
20c80 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  .nEq; i++){.    
20c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
20ca0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  oop->aLTerm[i]->
20cb0 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20 20 20  pExpr==pX ){.   
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
20cd0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ert( (pLoop->aLT
20ce0 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61 74 6f  erm[i]->eOperato
20cf0 72 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a 20 20  r & WO_IN) );.  
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 4f                bO
20d10 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
20d20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
20d40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
20d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20d60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
20d70 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  Get the column n
20d80 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62  umber in the tab
20d90 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64  le (iColumn) and
20da0 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20   sort order.    
20db0 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20      ** (revIdx) 
20dc0 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c  for the j-th col
20dd0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
20de0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20df0 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
20e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ){.          iCo
20e10 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
20e20 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
20e30 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
20e40 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
20e50 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
20e60 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
20e70 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
20e80 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
20e90 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
20ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
20eb0 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  umn = XN_ROWID;.
20ec0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
20ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
20ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75  .        /* An u
20ef0 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c  nconstrained col
20f00 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62  umn that might b
20f10 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61  e NULL means tha
20f20 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  t this.        *
20f30 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e  * WhereLoop is n
20f40 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a  ot well-ordered.
20f50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
20f60 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69     if( isOrderDi
20f70 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20  stinct.         
20f80 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  && iColumn>=0.  
20f90 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f         && j>=pLo
20fa0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a  op->u.btree.nEq.
20fb0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64           && pInd
20fc0 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ex->pTable->aCol
20fd0 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  [iColumn].notNul
20fe0 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  l==0.        ){.
20ff0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
21000 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  rDistinct = 0;. 
21010 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21020 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52    /* Find the OR
21030 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74  DER BY term that
21040 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
21050 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a  the j-th column.
21060 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
21070 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b  e index and mark
21080 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74   that ORDER BY t
21090 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20  erm off .       
210a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 73 4d 61   */.        isMa
210b0 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
210c0 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
210d0 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
210e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
210f0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
21100 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
21110 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
21120 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
21130 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
21140 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
21150 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
21160 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
21170 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
21180 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
21190 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
211a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
211b0 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
211c0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
211d0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
211e0 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
211f0 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
21200 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
21210 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
21220 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
21230 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
21240 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
21250 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21260 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
21270 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
21280 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21290 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
212a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
212b0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
212c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
212d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
212e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
212f0 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
21300 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
21310 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
21320 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
21330 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21340 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21360 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
21370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
21380 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
21390 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
213a0 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
213b0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
213c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
213d0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
213e0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
213f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21400 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
21410 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
21420 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
21430 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
21440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21450 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
21460 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
21470 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
21480 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
21490 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
214a0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
214b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
214c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
214d0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
214e0 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
214f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
21500 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
21510 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
21520 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
21530 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
21540 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
21550 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
21560 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
21570 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
21580 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
21590 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
215a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
215b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
215c0 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
215d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
215e0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
215f0 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
21600 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
21610 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
21620 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
21630 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
21640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21650 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
21660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21670 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44  Column==XN_ROWID
21680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21690 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e  testcase( distin
216a0 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a  ctColumns==0 );.
216b0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
216c0 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b  inctColumns = 1;
216d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
216e0 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
216f0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
21700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21710 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68       /* No match
21720 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
21730 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20      if( j==0 || 
21740 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  j<nKeyCol ){.   
21750 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21760 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
21770 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
21780 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
21790 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
217a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
217b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
217c0 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
217d0 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
217e0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
217f0 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63       if( distinc
21800 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20  tColumns ){.    
21810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
21820 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30  OrderDistinct==0
21830 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72   );.        isOr
21840 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
21850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
21860 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65  * end-if not one
21870 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  -row */..    /* 
21880 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68  Mark off any oth
21890 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  er ORDER BY term
218a0 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
218b0 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66   pLoop */.    if
218c0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
218d0 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  t ){.      order
218e0 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20  DistinctMask |= 
218f0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
21900 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21910 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
21920 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
21930 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  p;.        Bitma
21940 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20  sk mTerm;.      
21950 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
21960 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
21970 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
21980 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21990 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d  pExpr;.        m
219a0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
219b0 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70 57  ereExprUsage(&pW
219c0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70  Info->sMaskSet,p
219d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
219e0 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69  Term==0 && !sqli
219f0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21a00 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t(p) ) continue;
21a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54  .        if( (mT
21a20 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e  erm&~orderDistin
21a30 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
21a40 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
21a50 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
21a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21a70 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
21a80 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
21a90 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
21aa0 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
21ab0 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
21ac0 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
21ad0 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
21ae0 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20  (i8)nOrderBy;.  
21af0 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74  if( !isOrderDist
21b00 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  inct ){.    for(
21b10 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e  i=nOrderBy-1; i>
21b20 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42  0; i--){.      B
21b30 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42  itmask m = MASKB
21b40 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20  IT(i) - 1;.     
21b50 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d   if( (obSat&m)==
21b60 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  m ) return i;.  
21b70 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
21b80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
21b90 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  1;.}.../*.** If 
21ba0 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
21bb0 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
21bc0 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64   the mask passed
21bd0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
21be0 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20  Begin(),.** the 
21bf0 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20  planner assumes 
21c00 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69  that the specifi
21c10 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74  ed pOrderBy list
21c20 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47   is actually a G
21c30 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73  ROUP.** BY claus
21c40 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f  e - and so any o
21c50 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73  rder that groups
21c60 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65   rows as require
21c70 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a  d satisfies the.
21c80 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a  ** request..**.*
21c90 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74  * Normally, in t
21ca0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
21cb0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
21cc0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65  the caller to de
21cd0 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
21ce0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f  er or not the ro
21cf0 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65  ws are really be
21d00 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e  ing delivered in
21d10 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f   sorted order, o
21d20 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d  r.** just in som
21d30 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68  e other order th
21d40 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  at provides the 
21d50 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e  required groupin
21d60 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
21d70 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54  f the WHERE_SORT
21d80 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20  BYGROUP flag is 
21d90 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73  also passed to s
21da0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
21db0 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  (), then.** this
21dc0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
21dd0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72   called on the r
21de0 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
21df0 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74  o object. It ret
21e00 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20  urns.** true if 
21e10 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20  the rows really 
21e20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69  will be sorted i
21e30 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
21e40 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a  order, or false.
21e50 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ** otherwise..**
21e60 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
21e70 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a   assuming:.**.**
21e80 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
21e90 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a  i1 ON t1(x, Y);.
21ea0 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a  **.** then.**.**
21eb0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
21ec0 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79   t1 GROUP BY x,y
21ed0 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20   ORDER BY x,y;  
21ee0 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
21ef0 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  1.**   SELECT * 
21f00 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
21f10 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c   y,x ORDER BY y,
21f20 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  x;   -- IsSorted
21f30 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ()==0.*/.int sql
21f40 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65  ite3WhereIsSorte
21f50 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
21f60 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nfo){.  assert( 
21f70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
21f80 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
21f90 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  BY );.  assert( 
21fa0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
21fb0 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
21fc0 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75  YGROUP );.  retu
21fd0 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65  rn pWInfo->sorte
21fe0 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  d;.}..#ifdef WHE
21ff0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
22000 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
22010 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
22020 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
22030 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
22040 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
22050 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
22060 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
22070 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
22080 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
22090 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
220a0 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
220b0 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
220c0 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
220d0 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
220e0 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
220f0 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
22100 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
22110 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
22120 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22130 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
22140 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d  nRow rows, assum
22150 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79  ing that the key
22160 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65  s have .** nOrde
22170 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  rby columns and 
22180 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e  that the first n
22190 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  Sorted columns a
221a0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a  re already in.**
221b0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
221c0 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f  c LogEst whereSo
221d0 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65  rtingCost(.  Whe
221e0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a  reInfo *pWInfo,.
221f0 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20    LogEst nRow,. 
22200 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20   int nOrderBy,. 
22210 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a   int nSorted.){.
22220 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74    /* TUNING: Est
22230 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61  imated cost of a
22240 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73   full external s
22250 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ort, where N is 
22260 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
22270 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74   of rows to sort
22280 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
22290 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e   cost = (3.0 * N
222a0 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a   * log(N))..  **
222b0 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68   .  ** Or, if th
222c0 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73  e order-by claus
222d0 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75  e has X terms bu
222e0 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20  t only the last 
222f0 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72  Y .  ** terms ar
22300 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20  e out of order, 
22310 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69  then block-sorti
22320 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74  ng will reduce t
22330 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67  he .  ** sorting
22340 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20   cost to:.  **. 
22350 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
22360 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20  0 * N * log(N)) 
22370 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a  * (Y/X).  **.  *
22380 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d  * The (Y/X) term
22390 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
223a0 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69  using stack vari
223b0 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a  able rScale.  **
223c0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f   below.  */.  Lo
223d0 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f  gEst rScale, rSo
223e0 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74  rtCost;.  assert
223f0 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20  ( nOrderBy>0 && 
22400 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
22410 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61  t(100) );.  rSca
22420 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  le = sqlite3LogE
22430 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f  st((nOrderBy-nSo
22440 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72  rted)*100/nOrder
22450 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72  By) - 66;.  rSor
22460 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72  tCost = nRow + r
22470 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f  Scale + 16;..  /
22480 2a 20 46 6f 72 20 77 69 64 65 20 73 6f 72 74 73  * For wide sorts
22490 20 28 6d 61 6e 79 20 70 61 79 6c 6f 61 64 20 63   (many payload c
224a0 6f 6c 75 6d 6e 73 29 20 69 6e 63 72 65 61 73 65  olumns) increase
224b0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 63 6f 73   the sorting cos
224c0 74 0a 20 20 2a 2a 20 74 6f 20 61 63 63 6f 75 6e  t.  ** to accoun
224d0 74 20 66 6f 72 20 74 68 65 20 61 64 64 69 74 69  t for the additi
224e0 6f 6e 61 6c 20 49 2f 4f 20 75 73 65 64 20 62 79  onal I/O used by
224f0 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 73 6f   the external so
22500 72 74 69 6e 67 0a 20 20 2a 2a 20 61 6c 67 6f 72  rting.  ** algor
22510 69 74 68 6d 20 77 68 65 6e 20 69 74 20 66 6c 75  ithm when it flu
22520 73 68 65 73 20 50 4d 41 73 20 74 6f 20 64 69 73  shes PMAs to dis
22530 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  k..  */.  if( pW
22540 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
22550 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 70  .   && pWInfo->p
22560 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72  ResultSet->nExpr
22570 3e 36 0a 20 20 29 7b 0a 20 20 20 20 72 53 6f 72  >6.  ){.    rSor
22580 74 43 6f 73 74 20 2b 3d 20 73 71 6c 69 74 65 33  tCost += sqlite3
22590 4c 6f 67 45 73 74 28 70 57 49 6e 66 6f 2d 3e 70  LogEst(pWInfo->p
225a0 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72  ResultSet->nExpr
225b0 29 20 2d 20 32 36 3b 0a 20 20 7d 0a 0a 20 20 2f  ) - 26;.  }..  /
225c0 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f  * Multiple by lo
225d0 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73 20  g(M) where M is 
225e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
225f0 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20  tput rows..  ** 
22600 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66 6f  Use the LIMIT fo
22610 72 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d 61  r M if it is sma
22620 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70  ller */.  if( (p
22630 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
22640 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  s & WHERE_USE_LI
22650 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e 66  MIT)!=0 && pWInf
22660 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29  o->iLimit<nRow )
22670 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57 49  {.    nRow = pWI
22680 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d  nfo->iLimit;.  }
22690 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20  .  rSortCost += 
226a0 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
226b0 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74  return rSortCost
226c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
226d0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
226e0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61  reLoop objects a
226f0 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t pWInfo->pLoops
22700 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
22710 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
22720 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
22730 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
22740 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
22750 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
22760 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
22770 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
22780 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
22790 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
227a0 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  Assume that the 
227b0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
227c0 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74  output rows that
227d0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
227e0 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20   sorted.** will 
227f0 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74  be nRowEst (in t
22800 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65  he 10*log2 repre
22810 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c  sentation).  Or,
22820 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a   ignore sorting.
22830 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77  ** costs if nRow
22840 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65  Est==0..**.** Re
22850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22860 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c  n success or SQL
22870 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d  ITE_NOMEM of a m
22880 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
22890 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
228a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
228b0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
228c0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
228d0 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73  o, LogEst nRowEs
228e0 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69  t){.  int mxChoi
228f0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
22900 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
22910 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
22920 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
22930 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22950 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
22960 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
22970 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22980 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22990 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
229a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
229b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
229c0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
229d0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
229e0 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
229f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22a00 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68   counter over th
22a10 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a  e terms of the j
22a20 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c  oin */.  int ii,
22a30 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20   jj;            
22a40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22a50 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49  ers */.  int mxI
22a60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22a70 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
22a80 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70  ext entry to rep
22a90 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  lace */.  int nO
22aa0 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
22ab0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22ac0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22ad0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45   terms */.  LogE
22ae0 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
22af0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
22b00 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
22b10 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
22b20 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d  Est mxUnsorted =
22b30 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75   0;    /* Maximu
22b40 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20  m unsorted cost 
22b50 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
22b60 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
22b70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
22b80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
22b90 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
22ba0 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
22bb0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
22bc0 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
22bd0 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
22be0 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
22bf0 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
22c00 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
22c10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
22c20 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
22c30 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
22c40 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
22c50 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
22c60 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
22c70 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
22c80 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
22c90 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
22ca0 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
22cb0 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
22cc0 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
22cd0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
22ce0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
22cf0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
22d00 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
22d10 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
22d20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
22d30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
22d40 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
22d50 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
22d60 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53   */.  LogEst *aS
22d70 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20  ortCost = 0;    
22d80 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70  /* Sorting and p
22d90 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63  artial sorting c
22da0 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  osts */.  char *
22db0 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
22dc0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
22dd0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
22de0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
22df0 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20    int nSpace;   
22e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
22e10 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
22e20 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63  located at pSpac
22e30 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
22e40 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
22e50 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
22e60 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
22e70 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
22e80 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
22e90 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
22ea0 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
22eb0 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
22ec0 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
22ed0 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
22ee0 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
22ef0 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
22f00 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
22f10 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
22f20 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
22f30 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
22f40 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20  nLoop<=1) ? 1 : 
22f50 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
22f60 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
22f70 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
22f80 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
22f90 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
22fa0 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
22fb0 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45   solver.  (nRowE
22fc0 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45  st=%d)\n", nRowE
22fd0 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  st));..  /* If n
22fe0 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61  RowEst is zero a
22ff0 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  nd there is an O
23000 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
23010 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68  ignore it. In th
23020 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65  is.  ** case the
23030 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
23040 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69   call is to esti
23050 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
23060 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64  of rows returned
23070 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65  .  ** by the ove
23080 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65  rall query. Once
23090 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68   this estimate h
230a0 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
230b0 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  , the caller.  *
230c0 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  * will invoke th
230d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65  is function a se
230e0 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69  cond time, passi
230f0 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  ng the estimate 
23100 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77  as the.  ** nRow
23110 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20  Est parameter.  
23120 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
23130 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
23140 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  nRowEst==0 ){.  
23150 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
23160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72    }else{.    nOr
23170 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  derBy = pWInfo->
23180 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
23190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
231a0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
231b0 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
231c0 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72  , aFrom and aSor
231d0 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70  tCost[] */.  nSp
231e0 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68  ace = (sizeof(Wh
231f0 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
23200 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
23210 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
23220 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f   nSpace += sizeo
23230 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
23240 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d  erBy;.  pSpace =
23250 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
23260 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65  RawNN(db, nSpace
23270 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
23280 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
23290 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
232a0 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
232b0 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
232c0 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
232d0 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
232e0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
232f0 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
23300 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
23310 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
23320 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
23330 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
23340 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
23350 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
23360 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
23370 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69  op = pX;.  }.  i
23380 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
23390 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
233a0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
233b0 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e  ause and it is n
233c0 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  ot being ignored
233d0 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20  , set up.    ** 
233e0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53  space for the aS
233f0 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e  ortCost[] array.
23400 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   Each element of
23410 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61   the aSortCost a
23420 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65  rray.    ** is e
23430 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61  ither zero - mea
23440 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20  ning it has not 
23450 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  yet been initial
23460 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20  ized - or the.  
23470 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72    ** cost of sor
23480 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77  ting nRowEst row
23490 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20  s of data where 
234a0 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d  the first X term
234b0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
234c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
234d0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f  are already in o
234e0 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73  rder, where X is
234f0 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20   the array .    
23500 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ** index.  */.  
23510 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c    aSortCost = (L
23520 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d  ogEst*)pX;.    m
23530 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c  emset(aSortCost,
23540 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   0, sizeof(LogEs
23550 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a  t) * nOrderBy);.
23560 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53    }.  assert( aS
23570 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70  ortCost==0 || &p
23580 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
23590 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74  char*)&aSortCost
235a0 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20  [nOrderBy] );.  
235b0 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
235c0 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t!=0 || &pSpace[
235d0 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
235e0 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64  pX );..  /* Seed
235f0 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
23600 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
23610 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
23620 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
23630 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
23640 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
23650 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
23660 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
23670 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  8.  If the cost.
23680 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
23690 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
236a0 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
236b0 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
236c0 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72   first 28.  ** r
236d0 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
236e0 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
236f0 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
23700 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
23710 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
23720 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73  yLoop, 48);  ass
23730 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33  ert( 48==sqlite3
23740 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20  LogEst(28) );.  
23750 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73  nFrom = 1;.  ass
23760 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  ert( aFrom[0].is
23770 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20  Ordered==0 );.  
23780 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
23790 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20      /* If nLoop 
237a0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
237b0 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20  ere are no FROM 
237c0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65  terms in the que
237d0 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  ry. Since.    **
237e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   in this case th
237f0 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75  e query may retu
23800 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  rn a maximum of 
23810 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73  one row, the res
23820 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ults.    ** are 
23830 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
23840 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20  equested order. 
23850 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  Set isOrdered to
23860 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20   nOrderBy to.   
23870 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69   ** indicate thi
23880 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20  s. Or, if nLoop 
23890 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
238a0 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65  zero, set isOrde
238b0 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31  red to.    ** -1
238c0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
238d0 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
238e0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
238f0 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20  be ordered, .   
23900 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   ** depending on
23910 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64   the loops added
23920 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
23930 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46  plan.  */.    aF
23940 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
23950 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20   = nLoop>0 ? -1 
23960 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  : nOrderBy;.  }.
23970 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75  .  /* Compute su
23980 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65  ccessively longe
23990 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69  r WherePaths usi
239a0 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
239b0 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  generation.  ** 
239c0 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73  of WherePaths as
239d0 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74   the basis for t
239e0 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74  he next.  Keep t
239f0 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68  rack of the mxCh
23a00 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70  oice.  ** best p
23a10 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e  aths at each gen
23a20 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72  eration */.  for
23a30 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
23a40 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
23a50 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20  .    nTo = 0;.  
23a60 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f    for(ii=0, pFro
23a70 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f  m=aFrom; ii<nFro
23a80 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  m; ii++, pFrom++
23a90 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c  ){.      for(pWL
23aa0 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
23ab0 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
23ac0 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74  op=pWLoop->pNext
23ad0 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c  Loop){.        L
23ae0 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64   /* Rows visited
23b10 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   by (pFrom+pWLoo
23b20 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
23b30 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20  /* Cost of path 
23b60 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
23b70 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
23b80 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20   rUnsorted;     
23b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
23ba0 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
23bb0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
23bc0 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f  /.        i8 isO
23bd0 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
23be0 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69  isOrdered;  /* i
23bf0 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46  sOrdered for (pF
23c00 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
23c10 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
23c20 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20  askNew;         
23c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
23c40 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20   of src visited 
23c50 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20  by (..) */.     
23c60 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
23c70 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sk = 0;         
23c80 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
23c90 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20  rev-order loops 
23ca0 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20  for (..) */..   
23cb0 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
23cc0 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
23cd0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
23ce0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23cf0 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
23d00 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
23d10 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
23d20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23d30 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
23d40 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23d50 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
23d60 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31  && pFrom->nRow<1
23d70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
23d80 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20  * Do not use an 
23d90 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
23da0 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f 70  if the this loop
23db0 20 69 73 20 65 78 70 65 63 74 65 64 0a 20 20 20   is expected.   
23dc0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e         ** to run
23dd0 20 6c 65 73 73 20 74 68 61 6e 20 32 20 74 69 6d   less than 2 tim
23de0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
23df0 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
23e00 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
23e10 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
23e20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
23e30 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
23e40 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
23e50 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
23e60 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
23e70 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
23e80 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
23e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73   */.        rUns
23ea0 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
23eb0 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  ogEstAdd(pWLoop-
23ec0 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
23ed0 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
23ee0 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e  ow);.        rUn
23ef0 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
23f00 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
23f10 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73  ted, pFrom->rUns
23f20 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  orted);.        
23f30 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  nOut = pFrom->nR
23f40 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75  ow + pWLoop->nOu
23f50 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  t;.        maskN
23f60 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
23f70 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
23f80 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
23f90 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30   if( isOrdered<0
23fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
23fb0 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50  Ordered = whereP
23fc0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
23fd0 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
24000 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
24010 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24030 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
24040 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b  Loop, &revMask);
24050 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24060 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
24070 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
24080 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
24090 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
240a0 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65  red>=0 && isOrde
240b0 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a  red<nOrderBy ){.
240c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53            if( aS
240d0 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
240e0 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d]==0 ){.       
240f0 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69       aSortCost[i
24100 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72  sOrdered] = wher
24110 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
24120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
24130 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e  Info, nRowEst, n
24140 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72  OrderBy, isOrder
24150 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ed.            )
24160 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24170 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
24180 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
24190 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72  (rUnsorted, aSor
241a0 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
241b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48  );..          WH
241c0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a  ERETRACE(0x002,.
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
241e0 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25  ---- sort cost=%
241f0 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72  -3d (%d/%d) incr
24200 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74  eases cost %3d t
24210 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20  o %-3d\n",.     
24220 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
24230 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20  ost[isOrdered], 
24240 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65  (nOrderBy-isOrde
24250 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20  red), nOrderBy, 
24260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24270 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74  rUnsorted, rCost
24280 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ));.        }els
24290 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f  e{.          rCo
242a0 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  st = rUnsorted;.
242b0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
242c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
242d0 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f  ee if pWLoop sho
242e0 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20  uld be added to 
242f0 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20  the set of.     
24300 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62     ** mxChoice b
24310 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
24320 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
24330 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f       ** First lo
24340 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ok for an existi
24350 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65  ng path among be
24360 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a  st-so-far paths.
24370 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
24380 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20  covers the same 
24390 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
243a0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73   has the same is
243b0 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
243c0 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68  ** setting as th
243d0 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63  e current path c
243e0 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20  andidate..      
243f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24400 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d  The term "((pTo-
24410 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
24420 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20  ered)&0x80)==0" 
24430 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
24440 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f        ** to (pTo
24450 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  ->isOrdered==(-1
24460 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d  ))==(isOrdered==
24470 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72  (-1))" for the r
24480 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ange.        ** 
24490 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20  of legal values 
244a0 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d  for isOrdered, -
244b0 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a  1..64..        *
244c0 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
244d0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
244e0 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
244f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
24500 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
24510 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
24520 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f     && ((pTo->isO
24530 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
24540 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20  )&0x80)==0.     
24550 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
24560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a      testcase( jj
24570 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20  ==nTo-1 );.     
24580 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
245a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
245b0 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20  jj>=nTo ){.     
245c0 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20       /* None of 
245d0 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73  the existing bes
245e0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d  t-so-far paths m
245f0 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61  atch the candida
24600 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
24610 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
24620 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ce.           &&
24630 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c   (rCost>mxCost |
24640 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  | (rCost==mxCost
24650 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d   && rUnsorted>=m
24660 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20  xUnsorted)).    
24670 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24680 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
24690 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73  ent candidate is
246a0 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20   no better than 
246b0 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  any of the mxCho
246c0 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ice.            
246d0 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74  ** paths current
246e0 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73  ly in the best-s
246f0 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53  o-far buffer.  S
24700 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20  o discard.      
24710 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
24720 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76  ndidate as not v
24730 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66  iable. */.#ifdef
24740 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24750 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
24760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
24770 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
24780 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
24790 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
247a0 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20  gPrintf("Skip   
247b0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
247c0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
247f0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
24800 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
24810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24820 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
24830 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
24840 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
24850 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
24860 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
24870 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
24880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
24890 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
248a0 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68  ints it means th
248b0 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69  at the new candi
248c0 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20  date path.      
248d0 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20      ** needs to 
248e0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
248f0 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66  set of best-so-f
24900 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20  ar paths. */.   
24910 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
24920 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
24930 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
24940 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
24950 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
24960 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
24970 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
24980 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
249a0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
249b0 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
249c0 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
249d0 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
249e0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
249f0 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mxI;.          }
24a00 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d  .          pTo =
24a10 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65   &aTo[jj];.#ifde
24a20 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
24a30 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
24a40 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
24a50 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
24a60 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
24a70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24a80 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
24a90 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
24aa0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
24ab0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
24ac0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
24ad0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
24ae0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
24b00 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
24b10 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
24b20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
24b30 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
24b40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
24b50 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
24b60 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f   here if best-so
24b70 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54  -far path pTo=aT
24b80 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65  o[jj] covers the
24b90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
24ba0 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
24bb0 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 20  and has the sam 
24bc0 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e  isOrdered settin
24bd0 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  g as the.       
24be0 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20     ** candidate 
24bf0 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20  path.  Check to 
24c00 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69  see if the candi
24c10 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c  date should repl
24c20 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ace.          **
24c30 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63   pTo or if the c
24c40 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20  andidate should 
24c50 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20  be skipped */.  
24c60 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
24c70 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20  >rCost<rCost || 
24c80 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f  (pTo->rCost==rCo
24c90 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
24ca0 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66  =nOut) ){.#ifdef
24cb0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24cc0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
24cd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
24ce0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
24cf0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
24d00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24d10 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
24d20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70             "Skip
24d30 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
24d40 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d60 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
24d70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
24d80 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
24d90 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
24da0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
24db0 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
24dc0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
24dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24de0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
24df0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
24e00 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
24e30 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
24e40 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
24e50 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
24e60 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
24e70 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
24e80 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
24e90 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
24ea0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
24eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
24ec0 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61  card the candida
24ed0 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72  te path from fur
24ee0 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  ther considerati
24ef0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
24f00 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
24f10 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
24f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
24f30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
24f40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
24f50 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
24f60 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
24f70 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
24f80 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
24f90 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
24fa0 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20   path is better 
24fb0 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20  than the.       
24fc0 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20     ** pTo path. 
24fd0 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74   Replace pTo wit
24fe0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
24ff0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
25000 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
25010 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
25020 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25030 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
25040 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25050 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25070 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25  Update %s cost=%
25080 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
25090 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
250a0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
250b0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
250c0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
250d0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
250e0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
250f0 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
25100 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
25110 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25120 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
25130 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
25140 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
25160 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
25170 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
25180 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
25190 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
251a0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
251b0 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
251c0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
251d0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
251e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
251f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f  .        /* pWLo
25200 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20  op is a winner. 
25210 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73   Add it to the s
25220 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61  et of best so fa
25230 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  r */.        pTo
25240 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72  ->maskLoop = pFr
25250 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
25260 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
25270 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65  .        pTo->re
25280 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b  vLoop = revMask;
25290 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52  .        pTo->nR
252a0 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20  ow = nOut;.     
252b0 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
252c0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
252d0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20  To->rUnsorted = 
252e0 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
252f0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
25300 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20  d = isOrdered;. 
25310 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
25320 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d  o->aLoop, pFrom-
25330 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57  >aLoop, sizeof(W
25340 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70  hereLoop*)*iLoop
25350 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  );.        pTo->
25360 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70  aLoop[iLoop] = p
25370 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  WLoop;.        i
25380 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
25390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   ){.          mx
253a0 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  I = 0;.         
253b0 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d   mxCost = aTo[0]
253c0 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
253d0 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61    mxUnsorted = a
253e0 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20  To[0].nRow;.    
253f0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
25400 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
25410 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
25420 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
25430 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
25440 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20  st>mxCost .     
25450 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d          || (pTo-
25460 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  >rCost==mxCost &
25470 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64  & pTo->rUnsorted
25480 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20  >mxUnsorted) .  
25490 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
254a0 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73             mxCos
254b0 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
254d0 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e  Unsorted = pTo->
254e0 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
254f0 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a           mxI = j
25500 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  j;.            }
25510 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25530 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45     }..#ifdef WHE
25540 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25550 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69   /* >=2 */.    i
25560 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
25570 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20  race & 0x02 ){. 
25580 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25590 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
255a0 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
255b0 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
255c0 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
255d0 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
255e0 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
255f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25600 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
25610 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
25620 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
25630 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
25640 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
25650 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
25660 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
25670 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
25680 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54  Ordered>=0 ? (pT
25690 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
256a0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
256b0 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
256c0 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  ered>0 ){.      
256d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
256e0 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25  Printf(" rev=0x%
256f0 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76  llx\n", pTo->rev
25700 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Loop);.        }
25710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25720 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25730 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
25740 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25750 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
25760 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20   Swap the roles 
25770 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f  of aFrom and aTo
25780 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65   for the next ge
25790 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
257a0 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20  pFrom = aTo;.   
257b0 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20   aTo = aFrom;.  
257c0 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b    aFrom = pFrom;
257d0 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f  .    nFrom = nTo
257e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72  ;.  }..  if( nFr
257f0 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  om==0 ){.    sql
25800 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25810 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73  rse, "no query s
25820 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73  olution");.    s
25830 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25840 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
25850 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25860 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
25870 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
25880 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
25890 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
258a0 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
258b0 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
258c0 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
258d0 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
258e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
258f0 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
25900 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
25910 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
25920 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
25930 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
25940 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
25950 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
25960 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
25970 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
25980 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
25990 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
259a0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
259b0 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
259c0 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
259d0 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
259e0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
259f0 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
25a00 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
25a10 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
25a20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
25a30 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
25a40 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
25a50 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
25a60 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
25a70 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
25a80 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
25a90 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
25aa0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
25ab0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
25ac0 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
25ad0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
25ae0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
25af0 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
25b00 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
25b10 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
25b20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
25b30 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
25b40 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
25b50 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70  o->pResultSet, p
25b60 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
25b70 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53         WHERE_DIS
25b80 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31  TINCTBY, nLoop-1
25b90 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
25ba0 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
25bb0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
25bc0 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
25bd0 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
25be0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
25bf0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
25c00 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
25c10 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
25c20 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
25c30 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
25c40 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
25c50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
25c60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
25c70 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
25c80 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25c90 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
25ca0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
25cb0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
25cc0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
25cd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
25ce0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
25cf0 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
25d00 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
25d10 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
25d20 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
25d30 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  p;.      if( pWI
25d40 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29  nfo->nOBSat<=0 )
25d50 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
25d60 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20  ->nOBSat = 0;.  
25d70 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e        if( nLoop>
25d80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
25d90 33 32 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72  32 wsFlags = pFr
25da0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
25db0 31 5d 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  1]->wsFlags;.   
25dc0 20 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c         if( (wsFl
25dd0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
25de0 4f 57 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  OW)==0 .        
25df0 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 26 28     && (wsFlags&(
25e00 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f  WHERE_IPK|WHERE_
25e10 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48  COLUMN_IN))!=(WH
25e20 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f  ERE_IPK|WHERE_CO
25e30 4c 55 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20  LUMN_IN).       
25e40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
25e50 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
25e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
25e70 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53   rc = wherePathS
25e80 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
25e90 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
25ea0 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c  pOrderBy, pFrom,
25eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ec0 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44         WHERE_ORD
25ed0 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f  ERBY_LIMIT, nLoo
25ee0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
25ef0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b  p[nLoop-1], &m);
25f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
25f10 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
25f20 20 57 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20   WHERE_IPK );.  
25f30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25f40 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
25f50 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
25f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25f70 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72   rc==pWInfo->pOr
25f80 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
25fa0 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e  Info->bOrderedIn
25fb0 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20  nerLoop = 1;.   
25fc0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
25fd0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a  o->revMask = m;.
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
25ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26000 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26010 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  }.    if( (pWInf
26020 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
26030 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
26040 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57  P).        && pW
26050 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57  Info->nOBSat==pW
26060 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
26070 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30  nExpr && nLoop>0
26080 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69  .    ){.      Bi
26090 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
260a0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  0;.      int nOr
260b0 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53  der = wherePathS
260c0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
260d0 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e  pWInfo, pWInfo->
260e0 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
260f0 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e       pFrom, 0, n
26100 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
26110 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
26120 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b  revMask.      );
26130 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26140 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30  WInfo->sorted==0
26150 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f   );.      if( nO
26160 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  rder==pWInfo->pO
26170 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
26180 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
26190 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  >sorted = 1;.   
261a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
261b0 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Mask = revMask;.
261c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
261d0 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  }...  pWInfo->nR
261e0 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e  owOut = pFrom->n
261f0 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  Row;..  /* Free 
26200 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  temporary memory
26210 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63   and return succ
26220 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ess */.  sqlite3
26230 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
26240 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
26250 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26260 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
26270 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
26280 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
26290 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
262a0 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
262b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
262c0 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
262d0 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
262e0 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
262f0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
26300 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
26310 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
26320 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
26330 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
26340 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
26350 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
26360 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
26370 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
26380 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
26390 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
263a0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
263b0 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
263c0 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
263d0 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
263e0 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
263f0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
26400 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
26410 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
26420 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
26430 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
26440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26450 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
26460 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
26470 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
26480 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
26490 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
264a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
264b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
264c0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
264d0 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
264e0 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
264f0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
26500 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
26510 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20  Index *pIdx;..  
26520 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
26530 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
26540 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
26550 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
26560 55 42 43 4c 41 55 53 45 20 29 20 72 65 74 75 72  UBCLAUSE ) retur
26570 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
26580 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
26590 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
265a0 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
265b0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
265c0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
265d0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
265e0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
265f0 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
26600 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
26610 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
26620 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
26630 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
26640 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
26650 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
26660 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
26670 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f  lags = 0;.  pLoo
26680 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  p->nSkip = 0;.  
26690 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
266a0 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
266b0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
266c0 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  O_EQ|WO_IS, 0);.
266d0 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
266e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
266f0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
26700 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f  WO_IS );.    pLo
26710 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
26720 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
26730 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e  ERE_IPK|WHERE_ON
26740 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  EROW;.    pLoop-
26750 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
26760 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  rm;.    pLoop->n
26770 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70  LTerm = 1;.    p
26780 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
26790 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55  q = 1;.    /* TU
267a0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
267b0 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  rowid lookup is 
267c0 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d  10 */.    pLoop-
267d0 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20  >rRun = 33;  /* 
267e0 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
267f0 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65  t(10) */.  }else
26800 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  {.    for(pIdx=p
26810 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
26820 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
26830 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
26840 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73  opMask;.      as
26850 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54  sert( pLoop->aLT
26860 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d  ermSpace==pLoop-
26870 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  >aLTerm );.     
26880 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
26890 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20  dex(pIdx).      
268a0 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49   || pIdx->pPartI
268b0 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20  dxWhere!=0 .    
268c0 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79     || pIdx->nKey
268d0 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c  Col>ArraySize(pL
268e0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
268f0 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69  ) .      ) conti
26900 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73  nue;.      opMas
26910 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  k = pIdx->uniqNo
26920 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57  tNull ? (WO_EQ|W
26930 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20  O_IS) : WO_EQ;. 
26940 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
26950 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  pIdx->nKeyCol; j
26960 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65  ++){.        pTe
26970 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
26980 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  eFindTerm(pWC, i
26990 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73  Cur, j, 0, opMas
269a0 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
269b0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
269c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
269d0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
269e0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
269f0 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  IS );.        pL
26a00 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d  oop->aLTerm[j] =
26a10 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
26a20 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64        if( j!=pId
26a30 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
26a40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f  tinue;.      pLo
26a50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
26a60 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
26a70 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45  ERE_ONEROW|WHERE
26a80 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
26a90 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65  if( pIdx->isCove
26aa0 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e  ring || (pItem->
26ab0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
26ac0 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29  nsInIndex(pIdx))
26ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
26ae0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
26af0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
26b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26b10 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
26b20 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
26b30 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
26b40 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
26b50 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
26b60 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
26b70 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
26b80 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
26b90 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
26ba0 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
26bb0 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69  39;  /* 39==sqli
26bc0 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f  te3LogEst(15) */
26bd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26be0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
26bf0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a  oop->wsFlags ){.
26c00 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
26c10 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20  = (LogEst)1;.   
26c20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
26c30 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
26c40 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
26c50 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  f = sqlite3Where
26c60 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
26c70 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
26c80 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
26c90 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75  0].iTabCur = iCu
26ca0 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  r;.    pWInfo->n
26cb0 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  RowOut = 1;.    
26cc0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
26cd0 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e  erBy ) pWInfo->n
26ce0 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d  OBSat =  pWInfo-
26cf0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
26d00 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
26d10 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
26d20 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
26d30 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  CT ){.      pWIn
26d40 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
26d50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
26d60 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66  NIQUE;.    }.#if
26d70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
26d80 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
26d90 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
26da0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
26db0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
26dc0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
26dd0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
26de0 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
26df0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
26e00 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
26e10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
26e20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
26e30 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
26e40 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
26e50 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
26e60 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
26e70 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
26e80 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
26e90 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
26ea0 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
26eb0 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
26ec0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
26ed0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
26ee0 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
26ef0 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
26f00 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
26f10 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
26f20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
26f30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
26f40 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
26f50 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
26f60 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
26f70 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
26f80 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
26f90 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
26fa0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
26fb0 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
26fc0 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
26fd0 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
26fe0 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
26ff0 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
27000 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
27010 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
27020 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
27030 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
27040 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
27050 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
27060 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
27070 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
27080 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
27090 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
270a0 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
270b0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
270c0 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
270d0 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
270e0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
270f0 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
27100 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
27110 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
27120 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
27130 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
27140 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
27150 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
27160 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
27170 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
27180 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
27190 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
271a0 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
271d0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
271e0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27200 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
27210 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
27220 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
27230 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
27240 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
27250 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
27260 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
27270 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
27280 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
27290 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
272a0 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
272b0 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
272c0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
272d0 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
272e0 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
272f0 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
27300 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
27310 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
27320 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
27330 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
27340 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
27350 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
27360 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
27370 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
27380 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
27390 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
273a0 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
273b0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
273c0 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
273d0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
273e0 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
273f0 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
27400 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
27410 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
27420 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
27430 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
27440 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
27450 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
27460 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
27470 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
27480 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
27490 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
274a0 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
274b0 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
274c0 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
274d0 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
274e0 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
274f0 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
27500 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
27510 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
27520 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
27530 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
27540 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
27550 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
27560 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
27570 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
27580 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
27590 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
275a0 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
275b0 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
275c0 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
275d0 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
275e0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
275f0 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
27600 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
27610 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
27620 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
27630 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
27640 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
27650 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
27660 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
27670 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
27680 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
27690 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
276a0 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
276b0 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
276c0 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
276d0 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
276e0 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
276f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
27700 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
27710 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
27720 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
27730 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
27740 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
27750 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
27760 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
27770 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
27780 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
27790 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
277a0 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
277b0 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
277c0 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
277d0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
277e0 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
277f0 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
27800 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
27810 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
27820 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
27830 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
27840 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
27850 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
27860 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
27870 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
27880 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
27890 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
278a0 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
278b0 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
278c0 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
278d0 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
278e0 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
278f0 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
27900 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
27910 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
27920 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
27930 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
27940 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
27950 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
27960 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
27970 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
27980 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
27990 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
279a0 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
279b0 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
279c0 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
279d0 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
279e0 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
279f0 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
27a00 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
27a10 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
27a20 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
27a30 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
27a40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
27a50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
27a60 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  or the GROUP BY 
27a70 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65  clause.** if the
27a80 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
27a90 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63  lag is set in wc
27aa0 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53  trlFlags) of a S
27ab0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
27ac0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
27ad0 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
27ae0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
27af0 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
27b00 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
27b10 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
27b20 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
27b30 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
27b40 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
27b50 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72  *.** The iIdxCur
27b60 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
27b70 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
27b80 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66  of an index.  If
27b90 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55   .** WHERE_OR_SU
27ba0 42 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20  BCLAUSE is set, 
27bb0 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63  iIdxCur is the c
27bc0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
27bd0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75  an index.** to u
27be0 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  se for OR clause
27bf0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
27c00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  e WHERE clause s
27c10 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a  hould use this.*
27c20 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f  * specific curso
27c30 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45  r.  If WHERE_ONE
27c40 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20  PASS_DESIRED is 
27c50 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75  set, then iIdxCu
27c60 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  r is.** the firs
27c70 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61  t cursor in an a
27c80 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20  rray of cursors 
27c90 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  for all indices.
27ca0 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64    iIdxCur should
27cb0 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
27cc0 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f  ompute the appro
27cd0 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65  priate cursor de
27ce0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
27cf0 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65   index is.** use
27d00 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
27d10 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
27d20 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
27d30 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
27d40 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
27d50 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
27d60 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
27d70 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a   /* FROM clause:
27d80 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
27d90 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
27da0 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
27db0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20  Where,          
27dc0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
27dd0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
27de0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
27df0 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
27e00 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
27e10 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
27e20 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
27e30 65 73 75 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51  esultSet,   /* Q
27e40 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 2e  uery result set.
27e50 20 20 52 65 71 27 64 20 66 6f 72 20 44 49 53 54    Req'd for DIST
27e60 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36 20 77 63  INCT */.  u16 wc
27e70 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
27e80 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 5f 2a    /* The WHERE_*
27e90 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
27ea0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
27eb0 0a 20 20 69 6e 74 20 69 41 75 78 41 72 67 20 20  .  int iAuxArg  
27ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
27ed0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
27ee0 55 53 45 20 69 73 20 73 65 74 2c 20 69 6e 64 65  USE is set, inde
27ef0 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  x cursor number.
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
27f20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c  WHERE_USE_LIMIT,
27f30 20 74 68 65 6e 20 74 68 65 20 6c 69 6d 69 74 20   then the limit 
27f40 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  amount */.){.  i
27f50 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
27f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27f70 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
27f80 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
27f90 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
27fa0 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
27fb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27fc0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
27fd0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
27fe0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
27ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
28000 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
28010 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
28020 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
28030 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
28040 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
28050 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
28060 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
28070 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
28080 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
28090 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
280a0 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
280b0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
280c0 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
280d0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
280e0 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
280f0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
28100 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
28110 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
28120 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
28130 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
28140 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
28150 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
28160 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  >a[] */.  WhereL
28170 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
28180 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
28190 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
281a0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
281b0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
281d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
281e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28200 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
28210 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
28240 64 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64  de */.  u8 bFord
28250 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  elete = 0;      
28260 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52     /* OPFLAG_FOR
28270 44 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20  DELETE or zero, 
28280 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  as appropriate *
28290 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  /..  assert( (wc
282a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
282b0 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
282c0 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20  W)==0 || (.     
282d0 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26     (wctrlFlags &
282e0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
282f0 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20  ESIRED)!=0 .    
28300 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
28310 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
28320 41 55 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a  AUSE)==0 .  ));.
28330 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f  .  /* Only one o
28340 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  f WHERE_OR_SUBCL
28350 41 55 53 45 20 6f 72 20 57 48 45 52 45 5f 55 53  AUSE or WHERE_US
28360 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73  E_LIMIT */.  ass
28370 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
28380 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
28390 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 20 20  LAUSE)==0.      
283a0 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
283b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45  lags & WHERE_USE
283c0 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20  _LIMIT)==0 );.. 
283d0 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
283e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
283f0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
28400 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
28410 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
28420 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44  ));..  /* An ORD
28430 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ER/GROUP BY clau
28440 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20  se of more than 
28450 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20  63 terms cannot 
28460 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a  be optimized */.
28470 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64    testcase( pOrd
28480 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
28490 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29  ->nExpr==BMS-1 )
284a0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
284b0 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
284c0 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65  xpr>=BMS ) pOrde
284d0 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e  rBy = 0;.  sWLB.
284e0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
284f0 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
28500 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
28510 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
28520 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
28530 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
28540 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
28550 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
28560 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
28570 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
28580 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
28590 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
285a0 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
285b0 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
285c0 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
285d0 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
285e0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
285f0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
28600 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
28610 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
28620 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
28630 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
28640 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
28650 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
28660 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
28670 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
28680 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
28690 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
286a0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
286b0 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
286c0 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
286d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
286e0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
286f0 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
28700 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
28710 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
28720 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
28730 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
28740 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
28750 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
28760 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
28770 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
28780 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
28790 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
287a0 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
287b0 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
287c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
287d0 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
287e0 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
287f0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
28800 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
28810 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
28820 55 42 43 4c 41 55 53 45 29 20 3f 20 31 20 3a 20  UBCLAUSE) ? 1 : 
28830 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
28840 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
28850 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
28860 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
28870 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
28880 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
28890 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
288a0 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
288b0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
288c0 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
288d0 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
288e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
288f0 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
28900 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
28910 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
28920 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
28930 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
28940 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
28950 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
28960 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
28970 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
28980 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
28990 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
289a0 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
289b0 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
289c0 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
289d0 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
289e0 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f   nByteWInfo = RO
289f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72  UND8(sizeof(Wher
28a00 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74  eInfo)+(nTabList
28a10 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
28a20 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
28a30 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
28a40 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
28a50 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66  teWInfo + sizeof
28a60 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
28a70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
28a80 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
28a90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
28aa0 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
28ab0 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
28ac0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
28ad0 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  .  }.  pWInfo->p
28ae0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
28af0 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
28b00 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
28b10 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
28b20 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
28b30 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53  pWInfo->pResultS
28b40 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  et = pResultSet;
28b50 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  .  pWInfo->aiCur
28b60 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49  OnePass[0] = pWI
28b70 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
28b80 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49  s[1] = -1;.  pWI
28b90 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
28ba0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
28bb0 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66  ->iBreak = pWInf
28bc0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  o->iContinue = s
28bd0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
28be0 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
28bf0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
28c00 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
28c10 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41  nfo->iLimit = iA
28c20 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d  uxArg;.  pWInfo-
28c30 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
28c40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
28c50 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28  yLoop;.  memset(
28c60 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c  &pWInfo->nOBSat,
28c70 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 6f 66   0, .         of
28c80 66 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f  fsetof(WhereInfo
28c90 2c 73 57 43 29 20 2d 20 6f 66 66 73 65 74 6f 66  ,sWC) - offsetof
28ca0 28 57 68 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61  (WhereInfo,nOBSa
28cb0 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  t));.  memset(&p
28cc0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20  WInfo->a[0], 0, 
28cd0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
28ce0 29 2b 6e 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f  )+nTabList*sizeo
28cf0 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
28d00 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
28d10 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
28d20 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f  ASS_OFF );  /* O
28d30 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74 73 20  NEPASS defaults 
28d40 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73  to OFF */.  pMas
28d50 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  kSet = &pWInfo->
28d60 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42  sMaskSet;.  sWLB
28d70 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  .pWInfo = pWInfo
28d80 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26  ;.  sWLB.pWC = &
28d90 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73  pWInfo->sWC;.  s
28da0 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72  WLB.pNew = (Wher
28db0 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a 29  eLoop*)(((char*)
28dc0 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e  pWInfo)+nByteWIn
28dd0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  fo);.  assert( E
28de0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
28df0 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20 29  ENT(sWLB.pNew) )
28e00 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
28e10 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69  t(sWLB.pNew);.#i
28e20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
28e30 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63  G.  sWLB.pNew->c
28e40 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66  Id = '*';.#endif
28e50 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
28e60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
28e70 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
28e80 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
28e90 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
28ea0 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
28eb0 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
28ec0 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
28ed0 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
28ee0 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  skSet);.  sqlite
28ef0 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74  3WhereClauseInit
28f00 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
28f10 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65  WInfo);.  sqlite
28f20 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57 49  3WhereSplit(&pWI
28f30 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65  nfo->sWC, pWhere
28f40 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
28f50 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
28f60 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
28f70 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
28f80 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
28f90 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
28fa0 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
28fb0 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
28fc0 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
28fd0 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  hru..  */.  for(
28fe0 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57  ii=0; ii<sWLB.pW
28ff0 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  C->nTerm; ii++){
29000 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69 73  .    if( nTabLis
29010 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
29020 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
29030 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e 61  Join(sWLB.pWC->a
29040 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
29050 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29060 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
29070 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
29080 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69  pExpr, pWInfo->i
29090 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20  Break,.         
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
290c0 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e 70  L);.      sWLB.p
290d0 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61 67  WC->a[ii].wtFlag
290e0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
290f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29100 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e   Special case: N
29110 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  o FROM clause.  
29120 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73  */.  if( nTabLis
29130 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
29140 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66  pOrderBy ) pWInf
29150 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64  o->nOBSat = pOrd
29160 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
29170 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
29180 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
29190 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
291a0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
291b0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
291c0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
291d0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
291e0 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
291f0 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
29200 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
29210 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
29220 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65 72   ** The N-th ter
29230 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
29240 61 75 73 65 20 69 73 20 61 73 73 69 67 6e 65 64  ause is assigned
29250 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31 3c   a bitmask of 1<
29260 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  <N..  **.  ** Th
29270 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72  e rule of the pr
29280 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
29290 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66 20  ensures thta if 
292a0 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  X is the bitmask
292b0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62 6c   for.  ** a tabl
292c0 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73  e T, then X-1 is
292d0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
292e0 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65   all other table
292f0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
29300 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e 67   T..  ** Knowing
29310 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
29320 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
29330 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
29340 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20 69  t join is.  ** i
29350 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
29360 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
29370 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
29380 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
29390 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
293a0 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
293b0 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
293c0 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
293d0 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
293e0 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
293f0 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
29400 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
29410 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
29420 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
29430 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
29440 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
29450 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  USE flag is set.
29460 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
29470 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  ; ii<pTabList->n
29480 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Src; ii++){.    
29490 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b  createMask(pMask
294a0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
294b0 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
294c0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54     sqlite3WhereT
294d0 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72 73  abFuncArgs(pPars
294e0 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e, &pTabList->a[
294f0 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ii], &pWInfo->sW
29500 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  C);.  }.#ifdef S
29510 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
29520 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c  r(ii=0; ii<pTabL
29530 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29  ist->nSrc; ii++)
29540 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20  {.    Bitmask m 
29550 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
29560 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
29570 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
29580 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 61 73  iCursor);.    as
29590 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42 49 54  sert( m==MASKBIT
295a0 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  (ii) );.  }.#end
295b0 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
295c0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
295d0 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
295e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
295f0 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73  rAnalyze(pTabLis
29600 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29  t, &pWInfo->sWC)
29610 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
29620 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
29630 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
29640 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
29650 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
29660 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
29670 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
29680 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
29690 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
296a0 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
296b0 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
296c0 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
296d0 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
296e0 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
296f0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
29700 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
29710 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
29720 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
29730 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
29740 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
29750 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
29760 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
29770 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
29780 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
29790 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
297a0 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
297b0 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
297c0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
297d0 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
297e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
297f0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
29800 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
29810 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
29820 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
29830 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ED).  if( sqlite
29840 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
29850 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  ffff ){.    sqli
29860 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
29870 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
29880 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c  art *** (wctrlFl
29890 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c  ags: 0x%x",wctrl
298a0 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
298b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
298c0 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a  RE_USE_LIMIT ){.
298d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
298e0 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69  ugPrintf(", limi
298f0 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29  t: %d", iAuxArg)
29900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29910 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
29920 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  )\n");.  }.  if(
29930 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
29940 63 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a  ce & 0x100 ){ /*
29950 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72   Display all ter
29960 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
29970 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  clause */.    sq
29980 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
29990 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b  Print(sWLB.pWC);
299a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
299b0 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
299c0 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
299d0 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
299e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
299f0 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
29a00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29a10 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
29a20 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45  .  .#ifdef WHERE
29a30 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
29a40 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29a50 72 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a  reTrace ){    /*
29a60 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20   Display all of 
29a70 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
29a80 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57  jects */.      W
29a90 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20  hereLoop *p;.   
29aa0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
29ab0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
29ac0 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
29ad0 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
29ae0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
29af0 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
29b30 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
29b40 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
29b50 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20  o->pLoops, i=0; 
29b60 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
29b70 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p, i++){.       
29b80 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
29b90 5b 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  [i%sizeof(zLabel
29ba0 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  )];.        wher
29bb0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57  eLoopPrint(p, sW
29bc0 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  LB.pWC);.      }
29bd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29be0 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f  .    wherePathSo
29bf0 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b  lver(pWInfo, 0);
29c00 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
29c10 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
29c20 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29c30 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
29c40 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
29c50 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f       wherePathSo
29c60 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49  lver(pWInfo, pWI
29c70 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b  nfo->nRowOut+1);
29c80 0a 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  .       if( db->
29c90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
29ca0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
29cb0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
29cc0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
29cd0 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d  derBy==0 && (db-
29ce0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
29cf0 52 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30  ReverseOrder)!=0
29d00 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d   ){.     pWInfo-
29d10 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49  >revMask = ALLBI
29d20 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  TS;.  }.  if( pP
29d30 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
29d40 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
29d50 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
29d60 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
29d70 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
29d80 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
29d90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
29da0 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
29db0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29dc0 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
29dd0 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
29de0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
29df0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
29e00 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  BSat>0 ){.      
29e10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29e20 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c  tf(" ORDERBY=%d,
29e30 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d  0x%llx", pWInfo-
29e40 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d  >nOBSat, pWInfo-
29e50 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  >revMask);.    }
29e60 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49  .    switch( pWI
29e70 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
29e80 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
29e90 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
29ea0 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
29eb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
29ec0 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69  ("  DISTINCT=uni
29ed0 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62  que");.        b
29ee0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
29ef0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
29f00 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
29f10 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
29f20 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
29f30 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65   DISTINCT=ordere
29f40 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d");.        bre
29f50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
29f60 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
29f70 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a  TINCT_UNORDERED:
29f80 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
29f90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
29fa0 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65   DISTINCT=unorde
29fb0 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
29fc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
29fd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
29fe0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
29ff0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2a000 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  ii<pWInfo->nLeve
2a010 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  l; ii++){.      
2a020 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
2a030 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c  WInfo->a[ii].pWL
2a040 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  oop, sWLB.pWC);.
2a050 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2a060 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
2a070 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f   omit tables fro
2a080 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20  m the join that 
2a090 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68  do not effect th
2a0a0 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
2a0b0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2a0c0 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c  >=2.   && pResul
2a0d0 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70  tSet!=0.   && Op
2a0e0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2a0f0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69  d(db, SQLITE_Omi
2a100 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a  tNoopJoin).  ){.
2a110 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55      Bitmask tabU
2a120 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65  sed = sqlite3Whe
2a130 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
2a140 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73 75 6c  pMaskSet, pResul
2a150 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tSet);.    if( s
2a160 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  WLB.pOrderBy ){.
2a170 20 20 20 20 20 20 74 61 62 55 73 65 64 20 7c 3d        tabUsed |=
2a180 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
2a190 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
2a1a0 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72  Set, sWLB.pOrder
2a1b0 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  By);.    }.    w
2a1c0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  hile( pWInfo->nL
2a1d0 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20  evel>=2 ){.     
2a1e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2a1f0 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  m, *pEnd;.      
2a200 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  pLoop = pWInfo->
2a210 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  a[pWInfo->nLevel
2a220 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  -1].pWLoop;.    
2a230 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70    if( (pWInfo->p
2a240 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2a250 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f 69 6e 74  ->iTab].fg.joint
2a260 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d  ype & JT_LEFT)==
2a270 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
2a280 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
2a290 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
2a2a0 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20  STINCT)==0.     
2a2b0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
2a2c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2a2d0 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ROW)==0.      ){
2a2e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a2f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a300 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c 6f  ( (tabUsed & pLo
2a310 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2a320 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2a330 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d  pEnd = sWLB.pWC-
2a340 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e  >a + sWLB.pWC->n
2a350 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Term;.      for(
2a360 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e  pTerm=sWLB.pWC->
2a370 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70  a; pTerm<pEnd; p
2a380 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2a390 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
2a3a0 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e  reqAll & pLoop->
2a3b0 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20  maskSelf)!=0.   
2a3c0 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61        && !ExprHa
2a3d0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
2a3e0 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
2a3f0 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  oin).        ){.
2a400 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2a410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a420 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 65   }.      if( pTe
2a430 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b 3b  rm<pEnd ) break;
2a440 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
2a450 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20 64  E(0xffff, ("-> d
2a460 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20  rop loop %c not 
2a470 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e  used\n", pLoop->
2a480 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57 49  cId));.      pWI
2a490 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20  nfo->nLevel--;. 
2a4a0 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b       nTabList--;
2a4b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45  .    }.  }.  WHE
2a4c0 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28  RETRACE(0xffff,(
2a4d0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
2a4e0 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
2a4f0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
2a500 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
2a510 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  = pWInfo->nRowOu
2a520 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
2a530 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
2a540 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
2a550 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
2a560 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
2a570 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
2a580 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
2a590 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
2a5a0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
2a5b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
2a5c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a5d0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2a5e0 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
2a5f0 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
2a600 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
2a610 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a620 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a 20  DESIRED)!=0 ){. 
2a630 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d     int wsFlags =
2a640 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
2a650 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
2a660 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d     int bOnerow =
2a670 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
2a680 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20  E_ONEROW)!=0;.  
2a690 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 0a 20 20    if( bOnerow.  
2a6a0 20 20 20 7c 7c 20 28 28 77 63 74 72 6c 46 6c 61     || ((wctrlFla
2a6b0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2a6c0 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21 3d 30 0a  SS_MULTIROW)!=0.
2a6d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d             && 0=
2a6e0 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  =(wsFlags & WHER
2a6f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29  E_VIRTUALTABLE))
2a700 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 57  .    ){.      pW
2a710 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d  Info->eOnePass =
2a720 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41   bOnerow ? ONEPA
2a730 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50  SS_SINGLE : ONEP
2a740 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20  ASS_MULTI;.     
2a750 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
2a760 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61  abList->a[0].pTa
2a770 62 29 20 26 26 20 28 77 73 46 6c 61 67 73 20 26  b) && (wsFlags &
2a780 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2a790 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2a7a0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2a7b0 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2a7c0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
2a7d0 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50   bFordelete = OP
2a7e0 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a  FLAG_FORDELETE;.
2a7f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a800 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
2a810 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  WLoop->wsFlags =
2a820 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48 45   (wsFlags & ~WHE
2a830 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20  RE_IDX_ONLY);.  
2a840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2a850 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
2a860 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
2a870 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
2a880 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
2a890 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
2a8a0 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
2a8b0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c    */.  for(ii=0,
2a8c0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2a8d0 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
2a8e0 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
2a8f0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2a900 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
2a910 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
2a920 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
2a930 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
2a940 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2a950 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
2a960 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2a970 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
2a980 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
2a990 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2a9a0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2a9b0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
2a9c0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
2a9d0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2a9e0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
2a9f0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2aa00 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
2aa10 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  pWLoop;.    if( 
2aa20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
2aa30 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
2aa40 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  =0 || pTab->pSel
2aa50 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ect ){.      /* 
2aa60 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
2aa70 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20    }else.#ifndef 
2aa80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2aa90 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
2aaa0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2aab0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2aac0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
2aad0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
2aae0 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
2aaf0 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
2ab00 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
2ab10 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
2ab20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2ab30 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
2ab40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2ab50 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
2ab60 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
2ab70 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
2ab80 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2ab90 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
2aba0 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c   noop */.    }el
2abb0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
2abc0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2abd0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2abe0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
2abf0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2ac00 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2ac10 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  USE)==0 ){.     
2ac20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
2ac30 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  nRead;.      if(
2ac40 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2ac50 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s!=ONEPASS_OFF )
2ac60 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  {.        op = O
2ac70 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
2ac80 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
2ac90 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
2aca0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2acb0 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
2acc0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
2acd0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
2ace0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
2acf0 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
2ad00 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
2ad10 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c  tem->iCursor==pL
2ad20 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b  evel->iTabCur );
2ad30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ad40 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2ad50 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
2ad60 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
2ad70 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
2ad80 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65  tcase( pWInfo->e
2ad90 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2ada0 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43  _OFF && pTab->nC
2adb0 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
2adc0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2add0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2ade0 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2adf0 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69 64  <BMS && HasRowid
2ae00 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
2ae10 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
2ae20 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
2ae30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
2ae40 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
2ae50 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
2ae60 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
2ae70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
2ae80 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e  v, -1, SQLITE_IN
2ae90 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
2aea0 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
2aeb0 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
2aec0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
2aed0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2aee0 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
2aef0 54 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  TS.      if( pLo
2af00 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2af10 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex!=0 ){.       
2af20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2af30 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
2af40 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74 65  EEKEQ|bFordelete
2af50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
2af60 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
2af70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2af80 65 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46 6f  eChangeP5(v, bFo
2af90 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20  rdelete);.      
2afa0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2afb0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
2afc0 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73 71  ED_MASK.      sq
2afd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2afe0 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
2aff0 73 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d 2d  sUsed, pTabItem-
2b000 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a  >iCursor, 0, 0,.
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
2b030 73 74 20 75 38 2a 29 26 70 54 61 62 49 74 65 6d  st u8*)&pTabItem
2b040 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e  ->colUsed, P4_IN
2b050 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
2b060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2b070 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2b080 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2b090 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2b0a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
2b0b0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2b0c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2b0d0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49  DEXED ){.      I
2b0e0 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f  ndex *pIx = pLoo
2b0f0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2b100 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e  x;.      int iIn
2b110 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69 6e  dexCur;.      in
2b120 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
2b130 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41 75  ad;.      /* iAu
2b140 78 41 72 67 20 69 73 20 61 6c 77 61 79 73 20 73  xArg is always s
2b150 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69 74  et if to a posit
2b160 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e 45  ive value if ONE
2b170 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c 65  PASS is possible
2b180 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2b190 28 20 69 41 75 78 41 72 67 21 3d 30 20 7c 7c 20  ( iAuxArg!=0 || 
2b1a0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2b1b0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2b1c0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2b1d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61  );.      if( !Ha
2b1e0 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
2b1f0 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
2b200 78 28 70 49 78 29 0a 20 20 20 20 20 20 20 26 26  x(pIx).       &&
2b210 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2b220 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2b230 45 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  E)!=0.      ){. 
2b240 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
2b250 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e  s one term of an
2b260 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR-optimization
2b270 20 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41   using the PRIMA
2b280 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20  RY KEY of a.    
2b290 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52      ** WITHOUT R
2b2a0 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20  OWID table.  No 
2b2b0 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70 61 72  need for a separ
2b2c0 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ate index */.   
2b2d0 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
2b2e0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2b2f0 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 30  ;.        op = 0
2b300 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2b310 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2b320 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss!=ONEPASS_OFF 
2b330 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
2b340 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d   *pJ = pTabItem-
2b350 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
2b360 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2b370 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20   = iAuxArg;.    
2b380 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74 72      assert( wctr
2b390 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2b3a0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 29  NEPASS_DESIRED )
2b3b0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
2b3c0 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20 70   ALWAYS(pJ) && p
2b3d0 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20 20  J!=pIx ){.      
2b3e0 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b      iIndexCur++;
2b3f0 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d 20  .          pJ = 
2b400 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  pJ->pNext;.     
2b410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70 20     }.        op 
2b420 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
2b430 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2b440 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
2b450 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
2b460 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 41 75     }else if( iAu
2b470 78 41 72 67 20 26 26 20 28 77 63 74 72 6c 46 6c  xArg && (wctrlFl
2b480 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
2b490 55 42 43 4c 41 55 53 45 29 21 3d 30 20 29 7b 0a  UBCLAUSE)!=0 ){.
2b4a0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2b4b0 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20  r = iAuxArg;.   
2b4c0 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6f       op = OP_Reo
2b4d0 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 65  penIdx;.      }e
2b4e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  lse{.        iIn
2b4f0 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  dexCur = pParse-
2b500 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nTab++;.      }
2b510 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
2b520 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78 43  IdxCur = iIndexC
2b530 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
2b540 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
2b550 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
2b560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2b570 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
2b580 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a 20       if( op ){. 
2b590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b5a0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
2b5b0 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
2b5c0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
2b5d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
2b5e0 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
2b5f0 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
2b600 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2b610 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
2b620 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20 20  NSTRAINT)!=0.   
2b630 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
2b640 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
2b650 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
2b660 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d  HERE_SKIPSCAN))=
2b670 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2b680 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2b690 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
2b6a0 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  _MIN)==0.       
2b6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2b6c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2b6d0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2b6e0 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20  EQ); /* Hint to 
2b6f0 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20  COMDB2 */.      
2b700 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65    }.        Vdbe
2b710 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2b720 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
2b730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2b740 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2b750 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a  _MASK.        {.
2b760 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f            u64 co
2b770 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  lUsed = 0;.     
2b780 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b       int ii, jj;
2b790 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2b7a0 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f  i=0; ii<pIx->nCo
2b7b0 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lumn; ii++){.   
2b7c0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49           jj = pI
2b7d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b  x->aiColumn[ii];
2b7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b7f0 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65   jj<0 ) continue
2b800 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2b810 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36  ( jj>63 ) jj = 6
2b820 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  3;.            i
2b830 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f  f( (pTabItem->co
2b840 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
2b850 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  jj))==0 ) contin
2b860 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2b870 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34  colUsed |= ((u64
2b880 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69  )1)<<(ii<63 ? ii
2b890 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20   : 63);.        
2b8a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2b8b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
2b8c0 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  up8(v, OP_Column
2b8d0 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72  sUsed, iIndexCur
2b8e0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b900 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f          (u8*)&co
2b910 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29  lUsed, P4_INT64)
2b920 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
2b930 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
2b940 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2b950 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  MASK */.      }.
2b960 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
2b970 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f  b>=0 ) sqlite3Co
2b980 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
2b990 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
2b9a0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
2b9b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2b9c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
2b9d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2b9e0 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2b9f0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
2ba00 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
2ba10 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
2ba20 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
2ba30 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
2ba40 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
2ba50 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2ba60 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
2ba70 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
2ba80 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
2ba90 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
2baa0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
2bab0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2bac0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
2bad0 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c      int addrExpl
2bae0 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46  ain;.    int wsF
2baf0 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
2bb00 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69   = &pWInfo->a[ii
2bb10 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d  ];.    wsFlags =
2bb20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d   pLevel->pWLoop-
2bb30 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65  >wsFlags;.#ifnde
2bb40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2bb50 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
2bb60 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
2bb70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
2bb80 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
2bb90 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
2bba0 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
2bbb0 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  cIndex(pParse, &
2bbc0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20  pWInfo->sWC,.   
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
2bbe0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2bbf0 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61  ->iFrom], notRea
2bc00 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  dy, pLevel);.   
2bc10 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2bc20 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2bc30 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2bc40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2bc50 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73   addrExplain = s
2bc60 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61  qlite3WhereExpla
2bc70 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
2bc80 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c     pParse, pTabL
2bc90 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c  ist, pLevel, ii,
2bca0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
2bcb0 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29  wctrlFlags.    )
2bcc0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  ;.    pLevel->ad
2bcd0 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  drBody = sqlite3
2bce0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2bcf0 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  v);.    notReady
2bd00 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43   = sqlite3WhereC
2bd10 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
2bd20 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52  pWInfo, ii, notR
2bd30 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66  eady);.    pWInf
2bd40 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70  o->iContinue = p
2bd50 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b  Level->addrCont;
2bd60 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67  .    if( (wsFlag
2bd70 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
2bd80 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c  )==0 && (wctrlFl
2bd90 61 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42  ags&WHERE_OR_SUB
2bda0 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20  CLAUSE)==0 ){.  
2bdb0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2bdc0 41 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c  AddScanStatus(v,
2bdd0 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
2bde0 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b  l, addrExplain);
2bdf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2be00 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65   Done. */.  Vdbe
2be10 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2be20 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63  , "Begin WHERE-c
2be30 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  ore"));.  return
2be40 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a   pWInfo;..  /* J
2be50 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c  ump here if mall
2be60 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72  oc fails */.wher
2be70 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69  eBeginError:.  i
2be80 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
2be90 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2bea0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
2beb0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
2bec0 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65     whereInfoFree
2bed0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2bee0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2bef0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2bf00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2bf10 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
2bf20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
2bf30 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2bf40 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
2bf50 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2bf60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
2bf70 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
2bf80 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61  o *pWInfo){.  Pa
2bf90 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
2bfa0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
2bfb0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2bfc0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2bfd0 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
2bfe0 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c  pLevel;.  WhereL
2bff0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72  oop *pLoop;.  Sr
2c000 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2c010 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2c020 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
2c030 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2c040 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
2c050 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
2c060 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  code..  */.  Vdb
2c070 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
2c080 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f  v, "End WHERE-co
2c090 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  re"));.  sqlite3
2c0a0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2c0b0 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
2c0c0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31  pWInfo->nLevel-1
2c0d0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
2c0e0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
2c0f0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
2c100 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f  ->a[i];.    pLoo
2c110 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
2c120 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  op;.    sqlite3V
2c130 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2c140 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
2c150 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ont);.    if( pL
2c160 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f  evel->op!=OP_Noo
2c170 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
2c180 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2c190 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
2c1a0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2c1b0 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b  p2, pLevel->p3);
2c1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c1d0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c  beChangeP5(v, pL
2c1e0 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20  evel->p5);.     
2c1f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2c200 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2c210 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2c220 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a  ->op==OP_Next);.
2c230 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2c240 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2c250 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20  op==OP_Prev);.  
2c260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2c270 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2c280 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20  ==OP_VNext);.   
2c290 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
2c2a0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2c2b0 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
2c2c0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
2c2d0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2c2e0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
2c2f0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2c300 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2c310 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2c320 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
2c330 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
2c340 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
2c350 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
2c360 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
2c370 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
2c380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c390 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2c3a0 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
2c3b0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 2d 3e         if( pIn->
2c3c0 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e  eEndLoopOp!=OP_N
2c3d0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oop ){.         
2c3e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c3f0 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c  p2(v, pIn->eEndL
2c400 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72  oopOp, pIn->iCur
2c410 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2c420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2c430 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2c440 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2c450 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
2c460 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72  EndLoopOp==OP_Pr
2c470 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20  evIfOpen);.     
2c480 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2c490 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  eIf(v, pIn->eEnd
2c4a0 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49  LoopOp==OP_NextI
2c4b0 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  fOpen);.        
2c4c0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2c4d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2c4e0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d   pIn->addrInTop-
2c4f0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
2c500 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2c510 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2c520 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
2c530 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
2c540 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20  l->addrSkip ){. 
2c550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c560 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
2c570 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20  addrSkip);.     
2c580 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2c590 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e   "next skip-scan
2c5a0 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e   on %s", pLoop->
2c5b0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
2c5c0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
2c5d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2c5e0 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
2c5f0 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73  drSkip);.      s
2c600 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2c610 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  re(v, pLevel->ad
2c620 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d  drSkip-2);.    }
2c630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c640 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43  LIKE_DOESNT_MATC
2c650 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20  H_BLOBS.    if( 
2c660 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
2c670 52 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Rep ){.      sql
2c680 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2c690 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
2c6a0 6f 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d  o, (int)(pLevel-
2c6b0 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31  >iLikeRepCntr>>1
2c6c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2c6d0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65             pLeve
2c6e0 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b  l->addrLikeRep);
2c6f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2c700 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65  age(v);.    }.#e
2c710 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65  ndif.    if( pLe
2c720 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
2c730 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d  {.      int ws =
2c740 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
2c750 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
2c760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2c770 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65  v, OP_IfPos, pLe
2c780 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
2c790 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2c7a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c7b0 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
2c7c0 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 28 77 73 20  ONLY)==0 || (ws 
2c7d0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2c7e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
2c7f0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58   (ws & WHERE_IDX
2c800 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
2c810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c820 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
2c830 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e  lRow, pTabList->
2c840 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
2c850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c860 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
2c870 45 58 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c  EXED) .       ||
2c880 20 28 28 77 73 20 26 20 57 48 45 52 45 5f 4d 55   ((ws & WHERE_MU
2c890 4c 54 49 5f 4f 52 29 20 26 26 20 70 4c 65 76 65  LTI_OR) && pLeve
2c8a0 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 29 20 0a 20  l->u.pCovidx) . 
2c8b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c8c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c8d0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
2c8e0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2c8f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c900 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d   if( pLevel->op=
2c910 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20  =OP_Return ){.  
2c920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c930 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2c940 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  sub, pLevel->p1,
2c950 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2c960 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
2c970 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2c980 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65  3VdbeGoto(v, pLe
2c990 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
2c9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2c9b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2c9c0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
2c9d0 20 7d 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c   }.    VdbeModul
2c9e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
2c9f0 64 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  d WHERE-loop%d: 
2ca00 25 73 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  %s", i,.        
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
2ca20 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
2ca30 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
2ca40 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2ca50 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
2ca60 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
2ca70 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
2ca80 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
2ca90 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
2caa0 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
2cab0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2cac0 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
2cad0 69 42 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65  iBreak);..  asse
2cae0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
2caf0 65 6c 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  el<=pTabList->nS
2cb00 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rc );.  for(i=0,
2cb10 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2cb20 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  a; i<pWInfo->nLe
2cb30 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  vel; i++, pLevel
2cb40 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  ++){.    int k, 
2cb50 6c 61 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70  last;.    VdbeOp
2cb60 20 2a 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78   *pOp;.    Index
2cb70 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
2cb80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2cb90 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
2cba0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2cbb0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2cbc0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2cbd0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2cbe0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2cbf0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
2cc00 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2cc10 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  ;..    /* For a 
2cc20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e  co-routine, chan
2cc30 67 65 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e  ge all OP_Column
2cc40 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2cc50 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
2cc60 2a 2a 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  ** the co-routin
2cc70 65 20 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f  e into OP_Copy o
2cc80 66 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e  f result contain
2cc90 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
2cca0 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69  ..    ** OP_Rowi
2ccb0 64 20 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c  d becomes OP_Nul
2ccc0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
2ccd0 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76  ( pTabItem->fg.v
2cce0 69 61 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21  iaCoroutine && !
2ccf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2cd00 20 29 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c   ){.      transl
2cd10 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
2cd20 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
2cd30 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
2cd40 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
2cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd60 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
2cd70 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  esult, 0);.     
2cd80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2cd90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2cda0 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
2cdb0 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
2cdc0 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
2cdd0 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
2cde0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
2cdf0 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
2ce00 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
2ce10 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
2ce20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
2ce30 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
2ce40 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
2ce50 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
2ce60 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
2ce70 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
2ce80 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
2ce90 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
2cea0 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
2ceb0 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
2cec0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
2ced0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
2cee0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
2cef0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
2cf00 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
2cf10 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
2cf20 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
2cf30 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
2cf40 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
2cf50 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
2cf60 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
2cf70 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
2cf80 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
2cf90 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
2cfa0 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
2cfb0 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
2cfc0 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
2cfd0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
2cfe0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2cff0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2d000 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
2d010 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
2d020 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
2d030 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2d040 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
2d050 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2d060 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
2d070 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
2d080 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC
2d090 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  ovidx;.    }.   
2d0a0 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26   if( pIdx.     &
2d0b0 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  & (pWInfo->eOneP
2d0c0 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2d0d0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
2d0e0 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20  dx->pTable)).   
2d0f0 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63    && !db->malloc
2d100 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20  Failed.    ){.  
2d110 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
2d120 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2d130 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
2d140 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2d150 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
2d160 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
2d170 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
2d180 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
2d190 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
2d1a0 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
2d1b0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
2d1c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2d1d0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2d1e0 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
2d1f0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
2d200 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
2d210 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
2d220 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
2d230 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2d240 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
2d250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
2d260 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
2d270 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2d280 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2d290 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
2d2a0 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
2d2b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
2d2c0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  >=0 );.         
2d2d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
2d2e0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2d2f0 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
2d300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
2d310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2d320 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
2d330 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
2d340 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
2d350 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
2d360 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
2d370 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2d380 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2d390 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
2d3a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2d3b0 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  || pWInfo->eOneP
2d3c0 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ass );.        }
2d3d0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2d3e0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
2d3f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
2d400 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2d410 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2d420 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2d430 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
2d440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d450 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
2d460 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
2d470 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  .  pParse->nQuer
2d480 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
2d490 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
2d4a0 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
2d4b0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2d4c0 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.