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

Artifact ba36d01178f5957523cc600b95173057ae9a13ab378b4fc6ab5e14776767057b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e  pareSkip(pTerm->
1ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64 78       pScan->pIdx
1b10: 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20  Expr,iCur)==0). 
1b20: 20 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61          && (pSca
1b30: 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20  n->iEquiv<=1 || 
1b40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b50: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1b60: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
1b70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b80: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
1ba0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
1bb0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
1bc0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
1bd0: 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20  an->aiCur).     
1be0: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73        && (pX = s
1bf0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c00: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
1c10: 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70  pr->pRight))->op
1c20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1c30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c40: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1c50: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c60: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
1c70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1c80: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1c90: 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69  >aiCur[j]==pX->i
1ca0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
1cb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
1cc0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e  iColumn[j]==pX->
1cd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
1d30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72      pScan->aiCur
1d50: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
1d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d70: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1d80: 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  j] = pX->iColumn
1d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1da0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b  pScan->nEquiv++;
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
1df0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e10: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
1e20: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
1e30: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
1e40: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
1e50: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
1e60: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
1e70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e80: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
1ea0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1eb0: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
1ec0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
1ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
1ef0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
1f20: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
1f30: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1f80: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
1f90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1fc0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
2000: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2020: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
2030: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2040: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2050: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2070: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
2080: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20d0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
20e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20f0: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
2100: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
2110: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
2120: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
2130: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
2150: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72  le==pScan->aiCur
2160: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
2170: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
2180: 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e  =pScan->aiColumn
2190: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
21a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
21e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2200: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2210: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  pWC = pWC;.     
2220: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
2230: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
2240: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
2250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2270: 20 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e       pWC = pWC->
2280: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
2290: 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
22a0: 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pWC!=0 );.    i
22b0: 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  f( pScan->iEquiv
22c0: 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  >=pScan->nEquiv 
22d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 57 43  ) break;.    pWC
22e0: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
22f0: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
2300: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b    pScan->iEquiv+
2310: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
2330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
2340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
2350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
2380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
2390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
23a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
23b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
23c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
23e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
23f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
2430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
2440: 2e 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d  .   Or if pIdx!=
2450: 30 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75  0 then X is colu
2460: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e  mn iColumn of in
2470: 64 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a  dex pIdx.  pIdx.
2480: 2a 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  ** must be one o
2490: 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66  f the indexes of
24a0: 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a   table iCur..**.
24b0: 2a 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  ** The <op> must
24c0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
24d0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
24e0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
24f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
2500: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
2510: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2520: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
2530: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
2540: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
2550: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
2560: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
2570: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
2580: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
2590: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
25a0: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
25b0: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
25c0: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
25d0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
25e0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
25f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2600: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
2610: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
2620: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
2630: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
2640: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
2650: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
2660: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
2670: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
2680: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
2690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
26a0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
26b0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
26c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
26d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
26e0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26f0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
2700: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2720: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
2730: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2740: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2750: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
2760: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
2770: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
2780: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
2790: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
27a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
27c0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
27d0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
27e0: 20 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e   */.){.  pScan->
27f0: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
2800: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
2810: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78  C;.  pScan->pIdx
2820: 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61  Expr = 0;.  pSca
2830: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
2840: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2850: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64  e = 0;.  if( pId
2860: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  x ){.    int j =
2870: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
2880: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
2890: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28a0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45  f( iColumn==XN_E
28b0: 58 50 52 20 29 7b 0a 20 20 20 20 20 20 70 53 63  XPR ){.      pSc
28c0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 70  an->pIdxExpr = p
28d0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
28e0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
28f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2900: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2910: 5b 6a 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [j];.    }else i
2920: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
2930: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2940: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
2950: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
2960: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
2970: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  mn>=0 ){.      p
2980: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
2990: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
29a0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
29b0: 69 74 79 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ity;.      pScan
29c0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
29d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
29e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29f0: 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50   iColumn==XN_EXP
2a00: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
2a10: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2a20: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2a30: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2a40: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2a50: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
2a60: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
2a70: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
2a80: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
2a90: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
2aa0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
2ab0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2ac0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2ad0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2ae0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2af0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2b00: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b10: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2b20: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2b30: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2b40: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72  of table iCur or
2b50: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a   of index pIdx.*
2b60: 2a 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64  * if pIdx!=0 and
2b70: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2b80: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2b90: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2ba0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20  ed by.** the op 
2bb0: 70 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75  parameter.  Retu
2bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2bd0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
2be0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21  ..**.** If pIdx!
2c00: 3d 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  =0 then it must 
2c10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
2c20: 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69  dexes of table i
2c30: 43 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68  Cur.  .** Search
2c40: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2c50: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2c60: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2c70: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2c80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2ca0: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2cb0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
2cc0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
2cd0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
2ce0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
2cf0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d00: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
2d10: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2d20: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2d30: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2d40: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2d50: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2d60: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2d70: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2d80: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2d90: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2da0: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2db0: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2dc0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2dd0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2de0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2df0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2e00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2e10: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2e20: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2e30: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2e40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2e50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2e60: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2e70: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2e80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2e90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2eb0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ec0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2ee0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2ef0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2f00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2f10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2f20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2f30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2f40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2f50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2f60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2f70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2f80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2f90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2fa0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2fb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2fc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2fd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2fe0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2ff0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
3000: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
3010: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
3020: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
3030: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
3040: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
3050: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
3060: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
3070: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
3080: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3090: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
30a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
30b0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
30c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
30d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
30e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
30f0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3100: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3110: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3120: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3130: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3140: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3150: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3160: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3190: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
31a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
31b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
31c0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
31d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
31e0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
31f0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
3200: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
3210: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
3220: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
3230: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
3240: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
3250: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
3260: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
3270: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
3280: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
3290: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
32a0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
32b0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
32c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
32d0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
32e0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
32f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3300: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
3310: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3320: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3330: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3340: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3350: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3360: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3370: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3380: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3390: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
33c0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
33d0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
33e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
3400: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
3410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3420: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3430: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3440: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3450: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3460: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3480: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3490: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
34a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
34b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
34d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
3500: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
3510: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3540: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3550: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3560: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3580: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3590: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
35a0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
35d0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
35e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
35f0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
3600: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
3610: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3640: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3650: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3660: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3670: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3680: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
36a0: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
36b0: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
36c0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
36d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
36e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
36f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3700: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
3710: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
3720: 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
3730: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
3740: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
3750: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3760: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
3770: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3780: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
3790: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
37a0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
37b0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  f index pIdx is 
37c0: 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74  NOT NULL.*/.stat
37d0: 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75  ic int indexColu
37e0: 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20  mnNotNull(Index 
37f0: 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29  *pIdx, int iCol)
3800: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
3810: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
3820: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
3830: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
3840: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d  nColumn );.  j =
3850: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
3860: 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d  iCol];.  if( j>=
3870: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3880: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3890: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20  ol[j].notNull;. 
38a0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d   }else if( j==(-
38b0: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
38c0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
38d0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29   assert( j==(-2)
38e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
38f0: 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20  ;  /* Assume an 
3900: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
3910: 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79 69  on can always yi
3920: 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  eld a NULL */.. 
3930: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3940: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
3950: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
3960: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
3970: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
3980: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
3990: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
39a0: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
39b0: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
39c0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
39d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
39e0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
39f0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
3a00: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
3a10: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
3a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3a30: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
3a40: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
3a50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3a60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3a70: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
3a80: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
3a90: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
3aa0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
3ab0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3ac0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
3ad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
3ae0: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
3af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
3b00: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
3b10: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
3b20: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
3b30: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
3b40: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
3b70: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
3b80: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
3b90: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
3ba0: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
3bb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
3bc0: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
3bd0: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
3be0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
3bf0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
3c00: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
3c10: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
3c20: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
3c30: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
3c40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
3c50: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
3c60: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
3c70: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3c80: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
3c90: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
3ca0: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
3cb0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
3cc0: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
3cd0: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
3ce0: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
3cf0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
3d00: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
3d10: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
3d20: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
3d30: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
3d40: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
3d50: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
3d60: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
3d70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3d80: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
3d90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3da0: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
3db0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3dc0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3dd0: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
3de0: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
3df0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
3e00: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3e10: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
3e20: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
3e30: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
3e40: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
3e50: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
3e60: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
3e70: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
3e80: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
3e90: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
3ea0: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
3eb0: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
3ec0: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
3ed0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
3ee0: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
3ef0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
3f00: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
3f10: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
3f20: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
3f30: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
3f40: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
3f50: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
3f60: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
3f70: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
3f80: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
3f90: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
3fa0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
3fb0: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
3fc0: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
3fd0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
3fe0: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
3ff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
4000: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
4010: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
4020: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
4030: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
4040: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
4050: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
4060: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
4070: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
4080: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
4090: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
40a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
40b0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
40c0: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
40d0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
40e0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
40f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
4100: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4110: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
4120: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
4130: 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69 74   iBase, i, ~(Bit
4140: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
4150: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
4160: 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  if( findIndexCol
4170: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
4180: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
4190: 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   i)<0 ) break;. 
41a0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65 78         if( index
41b0: 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49  ColumnNotNull(pI
41c0: 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65 61  dx, i)==0 ) brea
41d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
41e0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
41f0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
4200: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
4210: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
4220: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4230: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
4240: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
4250: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4260: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4270: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
4280: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
4290: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
42a0: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
42b0: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
42c0: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
42d0: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
42e0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
42f0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
4300: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43  .** Convert OP_C
4310: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f  olumn opcodes to
4320: 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65 76   OP_Copy in prev
4330: 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
4340: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   code..**.** Thi
4350: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f  s routine runs o
4360: 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56 44  ver generated VD
4370: 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61 6e  BE code and tran
4380: 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e  slates OP_Column
4390: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f  .** opcodes into
43a0: 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74 68   OP_Copy when th
43b0: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
43c0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
43d0: 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e 73  -routine .** ins
43e0: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
43f0: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20  e lookup..**.** 
4400: 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77 69  If the bIncrRowi
4410: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
4420: 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f  , then any OP_Ro
4430: 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  wid instructions
4440: 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54   on.** cursor iT
4450: 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66  abCur are transf
4460: 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e 75  ormed into OP_Nu
4470: 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63 72  ll. Or, if bIncr
4480: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
4490: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68 20  o,.** then each 
44a0: 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61 6e  OP_Rowid is tran
44b0: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e 20  sformed into an 
44c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 69  instruction to i
44d0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
44e0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
44f0: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
4500: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4510: 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c  oid translateCol
4520: 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50 61 72  umnToCopy(.  Par
4530: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4540: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4550: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ext */.  int iSt
4560: 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  art,         /* 
4570: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 74  Translate from t
4580: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  his opcode to th
4590: 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  e end */.  int i
45a0: 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20 2f  TabCur,        /
45b0: 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52  * OP_Column/OP_R
45c0: 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73 20  owid references 
45d0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
45e0: 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65 72  .  int iRegister
45f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ,      /* The fi
4600: 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  rst column is in
4610: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4620: 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f 77  /.  int bIncrRow
4630: 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  id      /* If no
4640: 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f 72  n-zero, transfor
4650: 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f 50  m OP_rowid to OP
4660: 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29 7b  _AddImm(1) */.){
4670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64  rse->pVdbe;.  Vd
4690: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
46a0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
46b0: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
46c0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
46d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
46e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
46f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4710: 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69  ; iStart<iEnd; i
4720: 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Start++, pOp++){
4730: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  .    if( pOp->p1
4740: 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  !=iTabCur ) cont
4750: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
4760: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
4770: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f  lumn ){.      pO
4780: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
4790: 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  opy;.      pOp->
47a0: 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69  p1 = pOp->p2 + i
47b0: 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20  Register;.      
47c0: 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70  pOp->p2 = pOp->p
47d0: 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  3;.      pOp->p3
47e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
47f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
4800: 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
4810: 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69     if( bIncrRowi
4820: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
4830: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
4840: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
4850: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4860: 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f  the OP_Rowid. */
4870: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4880: 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d  code = OP_AddImm
4890: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48a0: 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  1 = pOp->p2;.   
48b0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31       pOp->p2 = 1
48c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
48d0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
48e0: 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20  de = OP_Null;.  
48f0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
4900: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  0;.        pOp->
4910: 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  p3 = 0;.      }.
4920: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4930: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
4940: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
4950: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
4960: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
4970: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
4980: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
4990: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
49a0: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
49b0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
49c0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
49d0: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
49e0: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
49f0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
4a00: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
4a10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
4a20: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
4a30: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
4a40: 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
4a50: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
4a60: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
4a70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4a80: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4a90: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4aa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4ab0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4ac0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4ae0: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
4af0: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
4b00: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
4b10: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
4b20: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
4b30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4b40: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
4b50: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4b60: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
4b70: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4b80: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
4b90: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4ba0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
4bb0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4bc0: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
4bd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
4be0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
4bf0: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
4c00: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
4c10: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
4c20: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
4c30: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
4c40: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
4c50: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
4c60: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
4c70: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
4c80: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4c90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4ca0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4cb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4cc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4cd0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ce0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4cf0: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
4d00: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
4d10: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
4d20: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
4d30: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
4d40: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
4d50: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4d60: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
4d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
4d80: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d90: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
4da0: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
4db0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4dc0: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
4dd0: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
4de0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4df0: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
4e00: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
4e10: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
4e20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e30: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
4e40: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
4e50: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
4e60: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e70: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52  tf("  estimatedR
4e80: 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e  ows=%lld\n", p->
4e90: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
4ea0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
4eb0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
4ec0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
4ed0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
4ee0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4ef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4f00: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
4f10: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4f20: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4f30: 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
4f40: 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
4f50: 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
4f60: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
4f70: 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
4f80: 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
4f90: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
4fa0: 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
4fb0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
4fc0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
4fd0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
4fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4ff0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
5000: 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
5010: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5020: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
5030: 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
5040: 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
5050: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
5060: 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
5070: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
5080: 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
5090: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
50a0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
50b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
50c0: 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
50d0: 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
50e0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
50f0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
5100: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65  |WO_IS))==0 ) re
5110: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
5120: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
5130: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
5140: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5150: 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
5160: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
5170: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
5180: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
5190: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
51a0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
51b0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
51c0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
51d0: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
51e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74  return 0;.  test
51f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
5200: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
5210: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5220: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
5230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
5240: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
5250: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5260: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
5270: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
5280: 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
5290: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
52a0: 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
52b0: 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
52c0: 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
52d0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
52e0: 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
52f0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
5300: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
5310: 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
5320: 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
5330: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5350: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
5360: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5370: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
5380: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
5390: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
53a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
53b0: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
53c0: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
53d0: 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
53e0: 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
53f0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
5400: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5410: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
5420: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
5430: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
5440: 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
5450: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
5460: 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
5470: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
5480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5490: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
54a0: 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
54b0: 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
54c0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
54d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
54e0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
54f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5500: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5510: 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
5520: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
5530: 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  a[] */.  Index *
5540: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
5550: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
5560: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
5570: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
5580: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55a0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
55b0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
55c0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
55d0: 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
55e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
55f0: 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
5600: 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
5610: 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
5620: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
5630: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
5640: 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
5650: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  d */.  int addrT
5660: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
5670: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
5680: 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
5690: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
56a0: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
56b0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
56c0: 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
56d0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
56e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5700: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5710: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
5730: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
5740: 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
5750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5760: 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
5770: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
5780: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
5790: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
57a0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
57b0: 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
57c0: 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
57d0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
57e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
57f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
5800: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20  r *zNotUsed;    
5810: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
5820: 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65  a space on the e
5830: 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  nd of pIdx */.  
5840: 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
5850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5860: 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
5870: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
5880: 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
5890: 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
58a0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
58b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
58c0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
58d0: 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
58e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
58f0: 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
5900: 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20  een issued */.  
5910: 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d  Expr *pPartial =
5920: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
5930: 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70  artial Index Exp
5940: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
5950: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20   iContinue = 0; 
5960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
5970: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78   here to skip ex
5980: 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20  cluded rows */. 
5990: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
59a0: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
59b0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
59c0: 74 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78  term being index
59d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
59e0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20  Counter = 0;    
59f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77      /* Address w
5a00: 68 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75  here integer cou
5a10: 6e 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  nter is initiali
5a20: 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zed */.  int reg
5a30: 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
5a40: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
5a50: 20 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65   registers where
5a60: 20 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d   record is assem
5a70: 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  bled */..  /* Ge
5a80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
5a90: 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
5aa0: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
5ab0: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
5ac0: 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
5ad0: 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
5ae0: 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
5af0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
5b00: 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
5b10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
5b20: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
5b30: 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
5b40: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
5b50: 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
5b60: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
5b70: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
5b80: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5b90: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5ba0: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
5bb0: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
5bc0: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
5bd0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
5be0: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
5bf0: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
5c00: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
5c10: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
5c20: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
5c30: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
5c40: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
5c50: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5c60: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
5c70: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
5c80: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
5c90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
5ca0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5cb0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5cc0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a  _FromJoin)    /*
5cd0: 20 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e   prereq always n
5ce0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  on-zero */.     
5cf0: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52      || pExpr->iR
5d00: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
5d10: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f  Src->iCursor   /
5d20: 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68  *   for the righ
5d30: 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20  t-hand   */.    
5d40: 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70       || pLoop->p
5d50: 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20  rereq!=0 );     
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20  /*   table of a 
5d80: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20  LEFT JOIN */.   
5d90: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72   if( pLoop->prer
5da0: 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  eq==0.     && (p
5db0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
5dc0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30  TERM_VIRTUAL)==0
5dd0: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
5de0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5df0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
5e00: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
5e10: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
5e20: 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43  (pExpr, pSrc->iC
5e30: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
5e40: 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74  pPartial = sqlit
5e50: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
5e60: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a  ->db, pPartial,.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5eb0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
5ec0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
5ed0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
5ee0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
5ef0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
5f00: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
5f10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
5f20: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
5f30: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
5f40: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
5f50: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
5f60: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
5f70: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
5f80: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
5f90: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  1 );.      if( !
5fa0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20  sentWarning ){. 
5fb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
5fc0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
5fd0: 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20  G_AUTOINDEX,.   
5fe0: 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61           "automa
5ff0: 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28  tic index on %s(
6000: 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  %s)", pTable->zN
6010: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
6020: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43   pTable->aCol[iC
6030: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
6040: 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20      sentWarning 
6050: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
6060: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
6070: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
6080: 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
6090: 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73  LoopResize(pPars
60a0: 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b  e->db, pLoop, nK
60b0: 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20  eyCol+1) ){.    
60c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
60d0: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
60e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
60f0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
6100: 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70  m[nKeyCol++] = p
6110: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
6120: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
6130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6140: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  }.  assert( nKey
6150: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  Col>0 );.  pLoop
6160: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
6170: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
6180: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70  nKeyCol;.  pLoop
6190: 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
61a0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
61b0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
61c0: 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
61f0: 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
6200: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
6210: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
6220: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
6230: 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
6240: 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
6250: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
6260: 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
6270: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
6280: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
6290: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
62a0: 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
62b0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
62c0: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
62d0: 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
62e0: 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
62f0: 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
6300: 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
6310: 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
6320: 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
6330: 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
6340: 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
6350: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
6360: 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
6370: 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
6380: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
6390: 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
63a0: 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
63b0: 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
63c0: 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
63d0: 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
63e0: 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
63f0: 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
6400: 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54  l = MIN(BMS-1,pT
6410: 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74  able->nCol);.  t
6420: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6430: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
6440: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
6450: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
6460: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6470: 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
6480: 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
6490: 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
64a0: 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a   nKeyCol++;.  }.
64b0: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
64c0: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
64d0: 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79  S-1) ){.    nKey
64e0: 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  Col += pTable->n
64f0: 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
6500: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
6510: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
6520: 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
6530: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
6540: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  pIdx = sqlite3Al
6550: 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
6560: 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  t(pParse->db, nK
6570: 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f  eyCol+1, 0, &zNo
6580: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49  tUsed);.  if( pI
6590: 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  dx==0 ) goto end
65a0: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
65b0: 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  te;.  pLoop->u.b
65c0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
65d0: 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  dx;.  pIdx->zNam
65e0: 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
65f0: 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
6600: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
6610: 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
6620: 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
6630: 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
6640: 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
6650: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
6660: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
6670: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
6680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
6690: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
66a0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
66b0: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
66c0: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
66d0: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
66e0: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
66f0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
6700: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
6710: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6720: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
6730: 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
6740: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
6750: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
6760: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
6770: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
6780: 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
6790: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
67a0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
67b0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
67c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
67d0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
67e0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
67f0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
6800: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6810: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c  zColl[n] = pColl
6820: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
6830: 3a 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  : sqlite3StrBINA
6840: 52 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  RY;.        n++;
6850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
6870: 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  2)n==pLoop->u.bt
6880: 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  ree.nEq );..  /*
6890: 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
68a0: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
68b0: 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
68c0: 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
68d0: 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
68e0: 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
68f0: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
6900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
6910: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
6920: 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  T(i) ){.      pI
6930: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6940: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
6950: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c  >azColl[n] = sql
6960: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
6970: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
6980: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
6990: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
69a0: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
69b0: 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
69c0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
69d0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
69e0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
69f0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
6a00: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6a10: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
6a20: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
6a30: 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79   assert( n==nKey
6a40: 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61  Col );.  pIdx->a
6a50: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f  iColumn[n] = XN_
6a60: 52 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61  ROWID;.  pIdx->a
6a70: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
6a80: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20  e3StrBINARY;..  
6a90: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
6aa0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
6ab0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
6ac0: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
6ad0: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
6ae0: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
6af0: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
6b00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
6b10: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
6b20: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
6b30: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
6b40: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
6b50: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
6b60: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
6b70: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
6b80: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
6b90: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
6ba0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6bb0: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
6bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6bd0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
6be0: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
6bf0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  C->pWInfo->pTabL
6c00: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
6c10: 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61  From];.  if( pTa
6c20: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
6c30: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
6c40: 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
6c50: 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
6c60: 3b 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65  ;.    addrCounte
6c70: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6c80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6c90: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6cb0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
6cc0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
6cd0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
6ce0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
6cf0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
6d00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6d10: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6d20: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6d30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6d40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6d50: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6d60: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6d70: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6d80: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6d90: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6da0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
6db0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
6dc0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
6dd0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
6de0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
6df0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
6e00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6e10: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6e20: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6e30: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6e40: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6e50: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6e60: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6e70: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6e80: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6e90: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6ea0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6eb0: 29 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73  );.  regBase = s
6ec0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
6ed0: 64 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50  dexKey(.      pP
6ee0: 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
6ef0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
6f00: 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
6f10: 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65   0.  );.  sqlite
6f20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6f30: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
6f40: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
6f50: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
6f60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6f70: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
6f80: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20  KRESULT);.  if( 
6f90: 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74  pPartial ) sqlit
6fa0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6fb0: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
6fc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
6fd0: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
6fe0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
6ff0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
7000: 61 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67  addrCounter, reg
7010: 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73  Base+n);.    tes
7020: 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
7030: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7040: 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65  );.    translate
7050: 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61  ColumnToCopy(pPa
7060: 72 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c  rse, addrTop, pL
7070: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
70a0: 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29  m->regResult, 1)
70b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
70c0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
70d0: 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d  );.    pTabItem-
70e0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
70f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7110: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
7120: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7130: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
7140: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7150: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
7160: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
7170: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
7180: 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
7190: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
71a0: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
71b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
71c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
71d0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
71e0: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
71f0: 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20  Parse);.  .  /* 
7200: 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
7210: 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
7220: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
7230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7240: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
7250: 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  ;..end_auto_inde
7260: 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69  x_create:.  sqli
7270: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7280: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
7290: 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  al);.}.#endif /*
72a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
72b0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
72c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
72e0: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
72f0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
7300: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7310: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
7320: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
7330: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
7340: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
7350: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
7360: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
7370: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
7380: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
7390: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
73a0: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
73b0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
73c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
73d0: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
73e0: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
73f0: 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
7400: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74  ause *pWC,.  Bit
7410: 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20  mask mUnusable, 
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7430: 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74  Ignore terms wit
7440: 68 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20  h these prereqs 
7450: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7460: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
7470: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
7480: 65 72 42 79 2c 0a 20 20 75 31 36 20 2a 70 6d 4e  erBy,.  u16 *pmN
7490: 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  oOmit           
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
74b0: 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20  of terms not to 
74c0: 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  omit */.){.  int
74d0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
74e0: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
74f0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7500: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
7510: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7520: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
7530: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
7540: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7550: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7560: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
7570: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7580: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
7590: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
75a0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
75b0: 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  o;.  u16 mNoOmit
75c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e   = 0;..  /* Coun
75d0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
75e0: 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63  possible WHERE c
75f0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
7600: 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a  s referring.  **
7610: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
7620: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
7630: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
7640: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
7650: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
7660: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
7670: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7680: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
76a0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
76b0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
76c0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
76d0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
76e0: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
76f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7700: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7710: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7720: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7730: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7740: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7750: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
7760: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7770: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7780: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
7790: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
77a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
77b0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
77c0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
77d0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
77e0: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
77f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7800: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7810: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7820: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7830: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7840: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7850: 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72  (-1) );.    nTer
7860: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
7870: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7880: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
7890: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
78a0: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
78b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
78c0: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
78d0: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
78e0: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
78f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7900: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7910: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
7920: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
7930: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
7940: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
7950: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
7960: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
7970: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7980: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7990: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
79a0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
79b0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
79c0: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
79d0: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
79e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
79f0: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
7a00: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
7a10: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
7a20: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
7a30: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
7a40: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
7a50: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7a60: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
7a70: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
7a80: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
7ab0: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
7ac0: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
7af0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
7b00: 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
7b10: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
7b20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7b30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7b40: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
7b50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7b60: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
7b70: 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
7b80: 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
7b90: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
7ba0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
7bb0: 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
7bc0: 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
7bd0: 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
7be0: 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
7bf0: 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
7c00: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
7c10: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
7c20: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
7c30: 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
7c40: 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
7c50: 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
7c60: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
7c70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7c80: 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
7c90: 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
7ca0: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
7cb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7cc0: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
7cd0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
7ce0: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
7cf0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7d00: 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
7d10: 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
7d20: 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
7d30: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
7d40: 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
7d50: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7d60: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
7d70: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
7d80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7d90: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
7da0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
7db0: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
7dc0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7dd0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
7de0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
7df0: 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
7e00: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
7e10: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7e20: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
7e30: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
7e40: 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
7ea0: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
7eb0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
7ec0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
7ed0: 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
7ee0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
7ef0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
7f00: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
7f10: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7f20: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
7f30: 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e   mUnusable ) con
7f40: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
7f50: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
7f60: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7f70: 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
7f80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7f90: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7fa0: 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
7fb0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7fc0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7fd0: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7fe0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7ff0: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
8000: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8010: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8020: 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20  r & WO_ALL );.  
8030: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
8040: 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49  perator & ~(WO_I
8050: 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57  SNULL|WO_EQUIV|W
8060: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74  O_IS))==0 ) cont
8070: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8080: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8090: 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
80a0: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
80b0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
80c0: 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20  olumn>=(-1) );. 
80d0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
80e0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
80f0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
8100: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
8110: 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
8120: 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72     op = (u8)pTer
8130: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8140: 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
8150: 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
8160: 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f  WO_EQ;.    if( o
8170: 70 3d 3d 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20  p==WO_MATCH ){. 
8180: 20 20 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d       op = pTerm-
8190: 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d  >eMatchOp;.    }
81a0: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
81b0: 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a  .op = op;.    /*
81c0: 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
81d0: 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
81e0: 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
81f0: 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
8200: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
8210: 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
8220: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8230: 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
8240: 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
8250: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
8260: 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
8270: 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
8280: 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
8290: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
82a0: 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
82b0: 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
82c0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
82d0: 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
82e0: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
82f0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8300: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
8310: 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
8320: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8330: 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
8340: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
8350: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8360: 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
8370: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
8380: 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
8390: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
83a0: 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
83b0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
83c0: 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  r & (WO_IN|WO_EQ
83d0: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
83e0: 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
83f0: 48 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6f  H) );..    if( o
8400: 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  p & (WO_LT|WO_LE
8410: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20  |WO_GT|WO_GE).  
8420: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
8430: 72 49 73 56 65 63 74 6f 72 28 70 54 65 72 6d 2d  rIsVector(pTerm-
8440: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20  >pExpr->pRight) 
8450: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
8460: 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74  ( i<16 ) mNoOmit
8470: 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20   |= (1 << i);.  
8480: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c      if( op==WO_L
8490: 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e  T ) pIdxCons[j].
84a0: 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20  op = WO_LE;.    
84b0: 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20    if( op==WO_GT 
84c0: 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70  ) pIdxCons[j].op
84d0: 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a   = WO_GE;.    }.
84e0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
84f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
8500: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
8510: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
8520: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
8530: 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
8540: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
8550: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
8560: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
8570: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
8580: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
8590: 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f  er;.  }..  *pmNo
85a0: 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a  Omit = mNoOmit;.
85b0: 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
85c0: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
85d0: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66  table object ref
85e0: 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73  erence passed as
85f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8600: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
8610: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65  ction.** must re
8620: 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61  present a virtua
8630: 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
8640: 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74  nction invokes t
8650: 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
8660: 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
8670: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
8680: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
8690: 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63  index_info objec
86a0: 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20  t that.** comes 
86b0: 69 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72  in as the 3rd ar
86c0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
86d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
86e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
86f0: 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70  s, pParse is pop
8700: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ulated with an e
8710: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
8720: 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76   a.** non-zero v
8730: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
8740: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
8750: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
8760: 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72  he output.** par
8770: 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  t of the sqlite3
8780: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
8790: 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f  cture is left po
87a0: 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  pulated..**.** W
87b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
87c0: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
87d0: 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
87e0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
87f0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
8800: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
8810: 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
8820: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
8830: 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
8840: 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
8850: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
8860: 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
8870: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
8880: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
8890: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
88a0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
88b0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
88c0: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
88d0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
88e0: 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  ->pVtab;.  int r
88f0: 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
8900: 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
8910: 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
8920: 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
8930: 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
8940: 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
8950: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8960: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
8970: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
8980: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8990: 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73 65  3OomFault(pParse
89a0: 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ->db);.    }else
89b0: 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
89c0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
89d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
89e0: 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
89f0: 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
8a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8a20: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
8a30: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8a50: 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
8a60: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
8a70: 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
8a80: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54 68 69 73  .#if 0.  /* This
8a90: 20 65 72 72 6f 72 20 69 73 20 6e 6f 77 20 63 61   error is now ca
8aa0: 75 67 68 74 20 62 79 20 74 68 65 20 63 61 6c 6c  ught by the call
8ab0: 65 72 2e 0a 20 20 2a 2a 20 53 65 61 72 63 68 20  er..  ** Search 
8ac0: 66 6f 72 20 22 78 42 65 73 74 49 6e 64 65 78 20  for "xBestIndex 
8ad0: 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c  malfunction" bel
8ae0: 6f 77 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ow */.  for(i=0;
8af0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
8b00: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
8b10: 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
8b20: 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
8b30: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
8b40: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
8b50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8b60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8b70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
8b80: 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
8b90: 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
8ba0: 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
8bb0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
8bc0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
8bd0: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
8be0: 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
8bf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8c00: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8c10: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
8c20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8c30: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
8c40: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
8c50: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
8c60: 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
8c70: 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
8c80: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
8c90: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
8ca0: 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
8cb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
8cc0: 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
8cd0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
8ce0: 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20  ss than pRec.** 
8cf0: 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
8d00: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8d10: 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52  rows equal to pR
8d20: 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ec.**.** Return 
8d30: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
8d40: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
8d50: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d  the smallest sam
8d60: 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67  ple that.** is g
8d70: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
8d80: 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f  qual to pRec. No
8d90: 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  te that this ind
8da0: 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64  ex is not an ind
8db0: 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61  ex.** into the a
8dc0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d  Sample[] array -
8dd0: 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20   it is an index 
8de0: 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73  into a virtual s
8df0: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  et of samples.**
8e00: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
8e10: 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c  ntents of aSampl
8e20: 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  e[] and the numb
8e30: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
8e40: 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e  record .** pRec.
8e50: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
8e60: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
8e70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e90: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8ea0: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
8eb0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
8ec0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
8ed0: 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
8ee0: 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
8ef0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
8f00: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
8f10: 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
8f20: 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
8f30: 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
8f40: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
8f50: 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
8f60: 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
8f70: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
8f80: 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
8f90: 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
8fa0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
8fb0: 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
8fc0: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
8fd0: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
8fe0: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
8ff0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9000: 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
9010: 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
9020: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
9050: 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70  irst sample >= p
9060: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61  Rec */.  int iSa
9070: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
9080: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
9090: 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
90a0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
90b0: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  pRec */.  int iM
90c0: 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
90d0: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
90e0: 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
90f0: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
9100: 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20   iTest;         
9110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
9120: 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20   sample to test 
9130: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
9160: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
9170: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  on */.  int nFie
9180: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
9190: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
91a0: 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20   fields in pRec 
91b0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  */.  tRowcnt iLo
91c0: 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wer = 0;        
91d0: 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45   /* anLt[] + anE
91e0: 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73  q[] of largest s
91f0: 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20  ample pRec is > 
9200: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
9210: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
9220: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
9230: 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
9240: 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
9250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
9260: 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
9270: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
9280: 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63  nField>0 && pRec
9290: 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e  ->nField<=pIdx->
92a0: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20  nSampleCol );.. 
92b0: 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20   /* Do a binary 
92c0: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
92d0: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
92e0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
92f0: 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52  equal.  ** to pR
9300: 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74  ec. If pRec cont
9310: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69  ains a single fi
9320: 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20  eld, the set of 
9330: 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63  samples to searc
9340: 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79  h.  ** is simply
9350: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9360: 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d  rray. If the sam
9370: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
9380: 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20  ] contain more. 
9390: 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65   ** than one fie
93a0: 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20  lds, all fields 
93b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
93c0: 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  rst are ignored.
93d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52  .  **.  ** If pR
93e0: 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  ec contains N fi
93f0: 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73  elds, where N is
9400: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20   more than one, 
9410: 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20  then as well as 
9420: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73  the.  ** samples
9430: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74   in aSample[] (t
9440: 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69  runcated to N fi
9450: 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63  elds), the searc
9460: 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20  h also has to.  
9470: 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66  ** consider pref
9480: 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61  ixes of those sa
9490: 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  mples. For examp
94a0: 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f  le, if the set o
94b0: 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69  f samples.  ** i
94c0: 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20  n aSample is:.  
94d0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  **.  **     aSam
94e0: 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20  ple[0] = (a, 5) 
94f0: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
9500: 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a  e[1] = (a, 10) .
9510: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9520: 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20  [2] = (b, 5) .  
9530: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33  **     aSample[3
9540: 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20  ] = (c, 100) .  
9550: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34  **     aSample[4
9560: 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a  ] = (c, 105).  *
9570: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
9580: 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f  search space sho
9590: 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74  uld ideally be t
95a0: 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65  he samples above
95b0: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75   and the .  ** u
95c0: 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b  nique prefixes [
95d0: 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e  a], [b] and [c].
95e0: 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20   But since that 
95f0: 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e  is hard to organ
9600: 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63  ize, .  ** the c
9610: 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61  ode actually sea
9620: 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a  rches this set:.
9630: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a    **.  **     0:
9640: 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31   (a) .  **     1
9650: 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (a, 5) .  **  
9660: 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20     2: (a, 10) . 
9670: 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31   **     3: (a, 1
9680: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20  0) .  **     4: 
9690: 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a  (b) .  **     5:
96a0: 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
96b0: 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20    6: (c) .  **  
96c0: 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a     7: (c, 100) .
96d0: 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20    **     8: (c, 
96e0: 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a  105).  **     9:
96f0: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
9700: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d   ** For each sam
9710: 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70  ple in the aSamp
9720: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61  le[] array, N sa
9730: 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  mples are presen
9740: 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66  t in the.  ** ef
9750: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61  fective sample a
9760: 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f  rray. In the abo
9770: 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e  ve, samples 0 an
9780: 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e  d 1 are based on
9790: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53   .  ** sample aS
97a0: 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65  ample[0]. Sample
97b0: 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61  s 2 and 3 on aSa
97c0: 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a  mple[1] etc..  *
97d0: 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61  *.  ** Often, sa
97e0: 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62  mple i of each b
97f0: 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74  lock of N effect
9800: 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20  ive samples has 
9810: 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20  (i+1) fields..  
9820: 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20  ** Except, each 
9830: 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78  sample may be ex
9840: 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65  tended to ensure
9850: 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61   that it is grea
9860: 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a  ter than or.  **
9870: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72   equal to the pr
9880: 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e  evious sample in
9890: 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20   the array. For 
98a0: 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20  example, in the 
98b0: 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d  above, .  ** sam
98c0: 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72  ple 2 is the fir
98d0: 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62  st sample of a b
98e0: 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65  lock of N sample
98f0: 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69  s, so at first i
9900: 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20  t .  ** appears 
9910: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62  that it should b
9920: 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a  e 1 field in siz
9930: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  e. However, that
9940: 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a   would make it .
9950: 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61    ** smaller tha
9960: 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74  n sample 1, so t
9970: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
9980: 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e   would not work.
9990: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20   As a result, . 
99a0: 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64   ** it is extend
99b0: 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73  ed to two fields
99c0: 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73  . The duplicates
99d0: 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74   that this creat
99e0: 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20  es do not .  ** 
99f0: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
9a00: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c  ms..  */.  nFiel
9a10: 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  d = pRec->nField
9a20: 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ;.  iCol = 0;.  
9a30: 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  iSample = pIdx->
9a40: 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64  nSample * nField
9a50: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
9a60: 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iSamp;          
9a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9a80: 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  ex in aSample[] 
9a90: 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  of test sample *
9aa0: 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  /.    int n;    
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9ad0: 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20   fields in test 
9ae0: 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  sample */..    i
9af0: 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61  Test = (iMin+iSa
9b00: 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61  mple)/2;.    iSa
9b10: 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69  mp = iTest / nFi
9b20: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61  eld;.    if( iSa
9b30: 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mp>0 ){.      /*
9b40: 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66   The proposed ef
9b50: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69  fective sample i
9b60: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61  s a prefix of sa
9b70: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61  mple aSample[iSa
9b80: 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70  mp]..      ** Sp
9b90: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20  ecifically, the 
9ba0: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
9bb0: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b  of at least (1 +
9bc0: 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a   iTest%nField) .
9bd0: 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20        ** fields 
9be0: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
9bf0: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
9c00: 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  s effective samp
9c10: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
9c20: 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69  r(n=(iTest % nFi
9c30: 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65  eld) + 1; n<nFie
9c40: 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; n++){.      
9c50: 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53    if( aSample[iS
9c60: 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  amp-1].anLt[n-1]
9c70: 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  !=aSample[iSamp]
9c80: 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65  .anLt[n-1] ) bre
9c90: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
9cb0: 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20   iTest + 1;.    
9cc0: 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  }..    pRec->nFi
9cd0: 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73  eld = n;.    res
9ce0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
9cf0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9d00: 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53  ple[iSamp].n, aS
9d10: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20  ample[iSamp].p, 
9d20: 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
9d30: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  es<0 ){.      iL
9d40: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
9d50: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
9d60: 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  + aSample[iSamp]
9d70: 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anEq[n-1];.    
9d80: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
9d90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9da0: 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65  res==0 && n<nFie
9db0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  ld ){.      iLow
9dc0: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9dd0: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20  mp].anLt[n-1];. 
9de0: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9df0: 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  t+1;.      res =
9e00: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
9e10: 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
9e20: 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f  iTest;.      iCo
9e30: 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  l = n-1;.    }. 
9e40: 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
9e50: 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a  iMin<iSample );.
9e60: 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20    i = iSample / 
9e70: 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20  nField;..#ifdef 
9e80: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
9e90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9ea0: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
9eb0: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
9ec0: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
9ed0: 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
9ee0: 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
9ef0: 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
9f00: 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
9f10: 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
9f20: 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
9f30: 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
9f40: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
9f50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
9f60: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d   ){.    if( res=
9f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
9f80: 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
9f90: 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  ue, then pRec mu
9fa0: 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  st be equal to s
9fb0: 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20  ample i. */.    
9fc0: 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
9fd0: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
9fe0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
9ff0: 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
a000: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
a010: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
a020: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
a030: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
a040: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
a050: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
a060: 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20  pRec) .         
a070: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
a080: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20  >mallocFailed . 
a090: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
a0a0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65  e{.      /* Unle
a0b0: 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  ss i==pIdx->nSam
a0c0: 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ple, indicating 
a0d0: 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72  that pRec is lar
a0e0: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ger than.      *
a0f0: 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  * all samples in
a100: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
a110: 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20  rray, pRec must 
a120: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
a130: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43  the.      ** (iC
a140: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
a150: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20  ix of sample i. 
a160: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a170: 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i<=pIdx->nSamp
a180: 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20  le && i>=0 );.  
a190: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
a1a0: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20   = iCol+1;.     
a1b0: 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
a1c0: 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
a1d0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
a1e0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a1f0: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
a200: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
a210: 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  ec)>0.          
a220: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
a230: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a240: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d  .      /* if i==
a250: 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74  0 and iCol==0, t
a260: 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20  hen record pRec 
a270: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
a280: 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20  all samples.    
a290: 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d    ** in the aSam
a2a0: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68  ple[] array. Oth
a2b0: 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c  erwise, if (iCol
a2c0: 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75  >0) then pRec mu
a2d0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67  st.      ** be g
a2e0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
a2f0: 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f  qual to the (iCo
a300: 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  l) field prefix 
a310: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20  of sample i..   
a320: 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20     ** If (i>0), 
a330: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61  then pRec must a
a340: 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74  lso be greater t
a350: 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29  han sample (i-1)
a360: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
a370: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
a380: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
a390: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61   iCol;.        a
a3a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
a3b0: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
a3c0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
a3d0: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
a3e0: 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )<=0.           
a3f0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
a400: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a420: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
a430: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
a440: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20   nField;.       
a450: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a460: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a470: 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
a480: 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
a490: 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20  , pRec)<0.      
a4a0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
a4b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a4c0: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
a4d0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
a4e0: 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
a4f0: 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72  EBUG */..  if( r
a500: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
a510: 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65  Record pRec is e
a520: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
a530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
a540: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
a550: 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
a560: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
a570: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
a580: 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
a590: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
a5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74  }else{.    /* At
a5b0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
a5c0: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
a5d0: 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c  prefix of aSampl
a5e0: 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
a5f0: 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  t .    ** sample
a600: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
a610: 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20   than pRec. Or, 
a620: 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
a630: 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20  ple then pRec.  
a640: 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74    ** is larger t
a650: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  han all samples 
a660: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f  in the array. */
a670: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
a680: 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
a690: 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d  f( i>=pIdx->nSam
a6a0: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70  ple ){.      iUp
a6b0: 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
a6c0: 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
a6d0: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
a6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a6f0: 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
a700: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a710: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a720: 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
a730: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
a740: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a750: 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
a760: 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
a770: 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
a780: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
a790: 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
a7a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
a7b0: 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
a7c0: 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
a7d0: 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
a7e0: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a7f0: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
a800: 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l];.  }..  /* Re
a810: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
a820: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
a830: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
a840: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
a850: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
a860: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
a870: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
a880: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a890: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
a8a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
a8b0: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
a8c0: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
a8d0: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
a8e0: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
a8f0: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
a900: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
a910: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
a920: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
a930: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
a940: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
a950: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a960: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
a970: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
a980: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
a990: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
a9a0: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
a9b0: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
a9c0: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
a9d0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
a9e0: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
a9f0: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
aa00: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
aa10: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
aa20: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
aa30: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
aa40: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
aa50: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
aa60: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
aa70: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
aa80: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
aa90: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
aaa0: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
aab0: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
aac0: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
aad0: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
aae0: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
aaf0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
ab00: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
ab10: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
ab20: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
ab30: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
ab40: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
ab50: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
ab60: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
ab70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
ab80: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
ab90: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
aba0: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
abb0: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
abc0: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
abd0: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
abe0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
abf0: 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  Ret;.}...#ifdef 
ac00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
ac10: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
ac20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66  ** Return the af
ac30: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e  finity for a sin
ac40: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  gle column of an
ac50: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20   index..*/.char 
ac60: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
ac70: 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74  mnAffinity(sqlit
ac80: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
ac90: 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  Idx, int iCol){.
aca0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
acb0: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
acc0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
acd0: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
ace0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
acf0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
ad00: 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20  tr(db, pIdx)==0 
ad10: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ad20: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
ad30: 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f  return pIdx->zCo
ad40: 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65  lAff[iCol];.}.#e
ad50: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
ad60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ad70: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a  3_OR_STAT4./* .*
ad80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ad90: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74  is called to est
ada0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
adb0: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
adc0: 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73   by a.** range-s
add0: 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63  can on a skip-sc
ade0: 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  an index. For ex
adf0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ample:.**.**   C
ae00: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
ae10: 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a  N t1(a, b, c);.*
ae20: 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
ae30: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
ae40: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41  ND c BETWEEN ? A
ae50: 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ND ?;.**.** Valu
ae60: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73  e pLoop->nOut is
ae70: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
ae80: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
ae90: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
aea0: 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73  ** visited for s
aeb0: 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44  canning (a=? AND
aec0: 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63   b=?). This func
aed0: 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61  tion reduces tha
aee0: 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62  t estimate .** b
aef0: 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f  y some factor to
af00: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
af10: 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e   (c BETWEEN ? AN
af20: 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20  D ?) expression 
af30: 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
af40: 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74  stat4 data for t
af50: 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73  he index. this s
af60: 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f  can will be pefo
af70: 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  rmed multiple .*
af80: 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f  * times (once fo
af90: 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d  r each (a,b) com
afa0: 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  bination that ma
afb0: 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65  tches a=?) is de
afc0: 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20  alt with .** by 
afd0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
afe0: 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62  * It does this b
aff0: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  y scanning throu
b000: 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d  gh all stat4 sam
b010: 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20  ples, comparing 
b020: 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63  values.** extrac
b030: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
b040: 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20  and pUpper with 
b050: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
b060: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68  g column in each
b070: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c  .** sample. If L
b080: 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e   and U are the n
b090: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
b0a0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73   found to be les
b0b0: 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75  s than or.** equ
b0c0: 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  al to the values
b0d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b0e0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
b0f0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  r respectively, 
b100: 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  and.** N is the 
b110: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
b120: 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f  samples, the pLo
b130: 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69  op->nOut value i
b140: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73  s adjusted.** as
b150: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
b160: 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20    nOut = nOut * 
b170: 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20  ( min(U - L, 1) 
b180: 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70  / N ).**.** If p
b190: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Lower is NULL, o
b1a0: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
b1b0: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
b1c0: 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69  om the term, L i
b1d0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f  s.** set to zero
b1e0: 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e  . If pUpper is N
b1f0: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
b200: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
b210: 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20  ted from it,.** 
b220: 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a  U is set to N..*
b230: 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  *.** Normally, t
b240: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
b250: 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62  s *pbDone to 1 b
b260: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
b270: 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
b280: 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  no value can be 
b290: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65  extracted from e
b2a0: 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20  ither pLower or 
b2b0: 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74  pUpper (and so t
b2c0: 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f  he.** estimate o
b2d0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b2e0: 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72  rows delivered r
b2f0: 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
b300: 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73  ), *pbDone.** is
b310: 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a   left as is..**.
b320: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
b330: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
b340: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
b350: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
b360: 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  se, .** SQLITE_O
b370: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
b380: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
b390: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
b3a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
b3b0: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
b3c0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
b3d0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
b3e0: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
b3f0: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
b400: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
b410: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
b420: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
b430: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
b440: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
b450: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
b460: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
b470: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
b480: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
b490: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e  /* Update the .n
b4a0: 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69  Out value of thi
b4b0: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
b4c0: 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20  *pbDone         
b4d0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
b4e0: 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
b4f0: 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72  expr. value extr
b500: 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e  acted */.){.  In
b510: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
b520: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
b530: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
b540: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
b550: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b560: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
b570: 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20  t nLower = -1;. 
b580: 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d   int nUpper = p-
b590: 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e  >nSample+1;.  in
b5a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b5b0: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c  ;.  u8 aff = sql
b5c0: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
b5d0: 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e  ffinity(db, p, n
b5e0: 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Eq);.  CollSeq *
b5f0: 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69  pColl;.  .  sqli
b600: 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20  te3_value *p1 = 
b610: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
b620: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
b630: 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20  rom pLower */.  
b640: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
b650: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
b660: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
b670: 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a  ed from pUpper *
b680: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
b690: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  e *pVal = 0;    
b6a0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
b6b0: 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f  racted from reco
b6c0: 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d  rd */..  pColl =
b6d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
b6e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
b6f0: 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20  >azColl[nEq]);. 
b700: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
b710: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b720: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b730: 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  r(pParse, pLower
b740: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b750: 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20   aff, &p1);.    
b760: 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  nLower = 0;.  }.
b770: 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20    if( pUpper && 
b780: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b790: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b7a0: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
b7b0: 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70  xpr(pParse, pUpp
b7c0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
b7d0: 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20  t, aff, &p2);.  
b7e0: 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20    nUpper = p2 ? 
b7f0: 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a  0 : p->nSample;.
b800: 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c    }..  if( p1 ||
b810: 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   p2 ){.    int i
b820: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b  ;.    int nDiff;
b830: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
b840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
b850: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
b860: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b870: 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e  lite3Stat4Column
b880: 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  (db, p->aSample[
b890: 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  i].p, p->aSample
b8a0: 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61  [i].n, nEq, &pVa
b8b0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
b8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
b8d0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
b8e0: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
b8f0: 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61  mCompare(p1, pVa
b900: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
b910: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
b920: 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nLower++;.      
b930: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
b940: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20  SQLITE_OK && p2 
b950: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b960: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b970: 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c  ompare(p2, pVal,
b980: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b990: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55   if( res>=0 ) nU
b9a0: 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pper++;.      }.
b9b0: 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20      }.    nDiff 
b9c0: 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77  = (nUpper - nLow
b9d0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  er);.    if( nDi
b9e0: 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20  ff<=0 ) nDiff = 
b9f0: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  1;..    /* If th
ba00: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
ba10: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62  pper and lower b
ba20: 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20  ound specified, 
ba30: 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
ba40: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69  comparisons indi
ba50: 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61  cate that they a
ba60: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
ba70: 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62  r, use the fallb
ba80: 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  ack.    ** metho
ba90: 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74  d (assume that t
baa0: 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31  he scan visits 1
bab0: 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29  /64 of the rows)
bac0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
bad0: 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65      ** the numbe
bae0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
baf0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73  d. Otherwise, es
bb00: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
bb10: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
bb20: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f   using the metho
bb30: 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  d described in t
bb40: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
bb50: 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  t for this funct
bb60: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
bb70: 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70  nDiff!=1 || pUpp
bb80: 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d  er==0 || pLower=
bb90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
bba0: 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74  nAdjust = (sqlit
bbb0: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d  e3LogEst(p->nSam
bbc0: 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f  ple) - sqlite3Lo
bbd0: 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20  gEst(nDiff));.  
bbe0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
bbf0: 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20  -= nAdjust;.    
bc00: 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20    *pbDone = 1;. 
bc10: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
bc20: 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b  0x10, ("range sk
bc30: 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ip-scan regions:
bc40: 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d   %u..%u  adjust=
bc50: 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  %d est=%d\n",.  
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c           nLower,
bc80: 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74   nUpper, nAdjust
bc90: 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  *-1, pLoop->nOut
bca0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  ));.    }..  }el
bcb0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
bcc0: 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  *pbDone==0 );.  
bcd0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
bce0: 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  eFree(p1);.  sql
bcf0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32  ite3ValueFree(p2
bd00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
bd10: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
bd20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
bd30: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
bd40: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
bd50: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  AT4 */../*.** Th
bd60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
bd70: 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
bd80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
bd90: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
bda0: 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
bdb0: 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
bdc0: 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
bdd0: 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
bde0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
bdf0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
be00: 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
be10: 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
be20: 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
be30: 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
be40: 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
be50: 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
be60: 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
be70: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
be80: 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
be90: 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
bea0: 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
beb0: 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
bec0: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
bed0: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
bee0: 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
bf00: 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
bf10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
bf20: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
bf30: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
bf40: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
bf50: 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
bf60: 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
bf70: 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
bf80: 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
bf90: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
bfa0: 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
bfb0: 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
bfc0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
bfd0: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
bfe0: 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69  e value in (pBui
bff0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
c000: 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20  ree.nEq) is the 
c010: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
c020: 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
c030: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
c040: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
c050: 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
c060: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
c070: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
c080: 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
c090: 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
c0a0: 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
c0b0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
c0c0: 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
c0d0: 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
c0e0: 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
c0f0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
c100: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
c110: 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
c120: 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
c130: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
c140: 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
c150: 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
c160: 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
c170: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
c180: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
c190: 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
c1a0: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
c1b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
c1c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
c1d0: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
c1e0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
c1f0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
c200: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
c210: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
c220: 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
c230: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
c240: 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
c250: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
c260: 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
c270: 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
c280: 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
c290: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
c2a0: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
c2b0: 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
c2c0: 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69  0, then *pnOut i
c2d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c2e0: 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
c2f0: 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
c300: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
c310: 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
c320: 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
c330: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
c340: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
c350: 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
c360: 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
c370: 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
c380: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
c390: 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
c3a0: 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
c3b0: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
c3c0: 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69  a single range i
c3d0: 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
c3e0: 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
c3f0: 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
c400: 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70  f 4. .** and a p
c410: 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  air of constrain
c420: 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  ts (x>? AND x<?)
c430: 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70   reduces the exp
c440: 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a  ected number of.
c450: 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  ** rows visited 
c460: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36  by a factor of 6
c470: 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  4..*/.static int
c480: 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
c490: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
c4a0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
c4b0: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
c4c0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
c4d0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
c4e0: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
c4f0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
c500: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
c510: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
c520: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
c530: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c540: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c550: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
c560: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c570: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
c580: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c590: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
c5a0: 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64  pLoop     /* Mod
c5b0: 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e  ify the .nOut an
c5c0: 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69  d maybe .rRun fi
c5d0: 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  elds */.){.  int
c5e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c5f0: 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c  .  int nOut = pL
c600: 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67  oop->nOut;.  Log
c610: 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  Est nNew;..#ifde
c620: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c630: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
c640: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
c650: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
c660: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
c670: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
c680: 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61  q;..  if( p->nSa
c690: 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d  mple>0 && nEq<p-
c6a0: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20  >nSampleCol ){. 
c6b0: 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
c6c0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
c6d0: 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
c6e0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
c6f0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
c700: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
c710: 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42  2];.      int nB
c720: 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  tm = pLoop->u.bt
c730: 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20  ree.nBtm;.      
c740: 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70  int nTop = pLoop
c750: 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
c760: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
c770: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
c780: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c790: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c7a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
c7b0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
c7c0: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
c7d0: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c7e0: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
c7f0: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
c800: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
c810: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
c820: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
c830: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
c840: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
c850: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
c860: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
c870: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
c880: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
c890: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
c8a0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c8b0: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
c8c0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
c8d0: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
c8e0: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
c8f0: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
c900: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
c910: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
c920: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
c930: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
c940: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
c950: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
c960: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
c970: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c980: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
c990: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
c9a0: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
c9b0: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
c9c0: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
c9d0: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
c9e0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c9f0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
ca00: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
ca10: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
ca20: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
ca30: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
ca40: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
ca50: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
ca60: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
ca70: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
ca80: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
ca90: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
caa0: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
cab0: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
cac0: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
cad0: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
cae0: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
caf0: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
cb00: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
cb10: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
cb20: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
cb30: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
cb40: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
cb50: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
cb60: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
cb70: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
cb80: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
cb90: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
cba0: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
cbb0: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
cbc0: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
cbd0: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
cbe0: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
cbf0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
cc00: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
cc10: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
cc20: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
cc30: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
cc40: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
cc50: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
cc60: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
cc70: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
cc80: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
cc90: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
cca0: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ccb0: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
ccc0: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
ccd0: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
cce0: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
ccf0: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
cd00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cd10: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
cd20: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
cd30: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
cd40: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
cd50: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
cd60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
cd70: 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
cd80: 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
cd90: 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
cda0: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  /.      if( nEq=
cdb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  =0 ){.        iL
cdc0: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
cdd0: 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52    iUpper = p->nR
cde0: 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65  owEst0;.      }e
cdf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
ce00: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
ce10: 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
ce20: 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
ce30: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
ce40: 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  must .        **
ce50: 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
ce60: 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  sted when testin
ce70: 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72  g key $P in wher
ce80: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e  eEqualScanEst().
ce90: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65    */.        whe
cea0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
ceb0: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  );.        iLowe
ced0: 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
cee0: 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
cef0: 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  + a[1];.      }.
cf00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cf10: 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f  Lower==0 || (pLo
cf20: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
cf30: 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21   (WO_GT|WO_GE))!
cf40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
cf50: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
cf60: 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
cf70: 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
cf80: 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  LE))!=0 );.     
cf90: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72   assert( p->aSor
cfa0: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
cfb0: 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f     if( p->aSortO
cfc0: 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20  rder[nEq] ){.   
cfd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65       /* The role
cfe0: 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20  s of pLower and 
cff0: 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70  pUpper are swapp
d000: 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e  ed for a DESC in
d010: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  dex */.        S
d020: 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20  WAP(WhereTerm*, 
d030: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b  pLower, pUpper);
d040: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e  .        SWAP(in
d050: 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a  t, nBtm, nTop);.
d060: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d070: 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
d080: 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c  mprove on the iL
d090: 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  ower estimate us
d0a0: 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a  ing ($P:$L). */.
d0b0: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
d0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
d0d0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d0e0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20        /* Values 
d0f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
d100: 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
d110: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
d120: 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
d130: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
d140: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
d150: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
d160: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
d170: 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20  xpr, nBtm, nEq, 
d180: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  &n);.        if(
d190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d1a0: 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  & n ){.         
d1b0: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
d1c0: 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73           u16 mas
d1d0: 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b  k = WO_GT|WO_LE;
d1e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
d1f0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
d200: 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20  Size(pExpr)>n ) 
d210: 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f  mask = (WO_LE|WO
d220: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _LT);.          
d230: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
d240: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d250: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
d260: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
d270: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
d280: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61  ->eOperator & ma
d290: 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  sk) ? a[1] : 0);
d2a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
d2b0: 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f  New>iLower ) iLo
d2c0: 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  wer = iNew;.    
d2d0: 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
d2e0: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d          pLower =
d2f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
d300: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d310: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
d320: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70  rove on the iUpp
d330: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
d340: 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20  g ($P:$U). */.  
d350: 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
d360: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78      /* Values ex
d390: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
d3a0: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
d3b0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
d3c0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
d3d0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
d3e0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
d3f0: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
d400: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
d410: 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e  r, nTop, nEq, &n
d420: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
d430: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d440: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  n ){.          t
d450: 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
d460: 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20         u16 mask 
d470: 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_GT|WO_LE;. 
d480: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
d490: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
d4a0: 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61  ze(pExpr)>n ) ma
d4b0: 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c  sk = (WO_LE|WO_L
d4c0: 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55  T);.          iU
d4d0: 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  prIdx = whereKey
d4e0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
d4f0: 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20   pRec, 1, a);.  
d500: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
d510: 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e  [0] + ((pUpper->
d520: 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b  eOperator & mask
d530: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
d540: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
d550: 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
d560: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
d570: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
d580: 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30        pUpper = 0
d590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d5a0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c    }..      pBuil
d5b0: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
d5c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
d5d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d5e0: 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
d5f0: 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
d600: 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
d610: 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
d620: 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
d630: 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
d640: 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20   If both iUpper 
d650: 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64  and iLower are d
d660: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20  erived from the 
d670: 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
d680: 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61  * sample, then a
d690: 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34  ssume they are 4
d6a0: 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65  x more selective
d6b0: 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20  .  This brings. 
d6c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
d6d0: 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74  estimated select
d6e0: 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69  ivity more in li
d6f0: 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20  ne with what it 
d700: 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20  would be.       
d710: 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74     ** if estimat
d720: 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75  ed without the u
d730: 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61  se of STAT3/4 ta
d740: 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  bles. */.       
d750: 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d     if( iLwrIdx==
d760: 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d  iUprIdx ) nNew -
d770: 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32  = 20;  assert( 2
d780: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
d790: 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (4) );.        }
d7a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d7b0: 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20  nNew = 10;      
d7c0: 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
d7d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
d7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d7f0: 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
d800: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t ){.          n
d810: 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  Out = nNew;.    
d820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48      }.        WH
d830: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
d840: 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61  "STAT4 range sca
d850: 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25  n: %u..%u  est=%
d860: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
d890: 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29  32)iUpper, nOut)
d8a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d8b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
d8c0: 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20  bDone = 0;.     
d8d0: 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
d8e0: 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72  SkipScanEst(pPar
d8f0: 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70  se, pLower, pUpp
d900: 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e  er, pLoop, &bDon
d910: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44  e);.      if( bD
d920: 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b  one ) return rc;
d930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
d940: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d950: 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
d960: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d970: 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73  pBuilder);.  ass
d980: 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70  ert( pLower || p
d990: 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a  Upper );.#endif.
d9a0: 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72    assert( pUpper
d9b0: 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e  ==0 || (pUpper->
d9c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d9d0: 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e  NULL)==0 );.  nN
d9e0: 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
d9f0: 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f  djust(pLower, nO
da00: 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68  ut);.  nNew = wh
da10: 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70  ereRangeAdjust(p
da20: 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20  Upper, nNew);.. 
da30: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
da40: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
da50: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
da60: 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65  limit and neithe
da70: 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73  r limit.  ** has
da80: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d   an application-
da90: 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f  defined likeliho
daa0: 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65  od(), assume the
dab0: 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72   range is.  ** r
dac0: 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64  educed by an add
dad0: 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69  itional 75%. Thi
dae0: 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79  s means that, by
daf0: 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65   default, an ope
db00: 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e  n-ended.  ** ran
db10: 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63  ge query (e.g. c
db20: 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d  ol > ?) is assum
db30: 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20  ed to match 1/4 
db40: 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  of the rows in t
db50: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57  he.  ** index. W
db60: 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61  hile a closed ra
db70: 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45  nge (e.g. col BE
db80: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69  TWEEN ? AND ?) i
db90: 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20  s estimated to. 
dba0: 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f   ** match 1/64 o
dbb0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20  f the index. */ 
dbc0: 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
dbd0: 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72   pLower->truthPr
dbe0: 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26  ob>0 && pUpper &
dbf0: 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50  & pUpper->truthP
dc00: 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65  rob>0 ){.    nNe
dc10: 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20  w -= 20;.  }..  
dc20: 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21  nOut -= (pLower!
dc30: 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30  =0) + (pUpper!=0
dc40: 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30  );.  if( nNew<10
dc50: 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
dc60: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
dc70: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66  nOut = nNew;.#if
dc80: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
dc90: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
dca0: 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e  f( pLoop->nOut>n
dcb0: 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45  Out ){.    WHERE
dcc0: 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e  TRACE(0x10,("Ran
dcd0: 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e  ge scan lowers n
dce0: 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  Out from %d to %
dcf0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
dd00: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
dd10: 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20  >nOut, nOut));. 
dd20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f   }.#endif.  pLoo
dd30: 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
dd40: 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
dd50: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
dd60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
dd70: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
dd80: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
dd90: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
dda0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
ddb0: 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
ddc0: 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
ddd0: 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
dde0: 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
ddf0: 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
de00: 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
de10: 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
de20: 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
de30: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
de40: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
de50: 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
de60: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
de70: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
de80: 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
de90: 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
dea0: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
deb0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
dec0: 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
ded0: 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
dee0: 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
def0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
df00: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
df10: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
df20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
df30: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
df40: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
df50: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
df60: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
df70: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
df80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
df90: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
dfa0: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
dfb0: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
dfc0: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
dfd0: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
dfe0: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
dff0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
e000: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
e010: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
e020: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
e030: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
e040: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
e050: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
e060: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
e070: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
e080: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
e090: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
e0a0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e0b0: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
e0c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e0d0: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
e0e0: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
e0f0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
e100: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
e110: 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
e120: 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
e130: 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
e140: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e150: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e160: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e170: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e180: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e190: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e1a0: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
e1b0: 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
e1c0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
e1d0: 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
e1e0: 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
e1f0: 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74  der->pRec;.  int
e200: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
e210: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
e220: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
e230: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
e240: 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
e250: 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
e260: 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
e270: 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
e280: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
e290: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  =p->nColumn );. 
e2a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e2b0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
e2c0: 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
e2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
e2e0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e2f0: 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49  d<nEq );..  /* I
e300: 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  f values are not
e310: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
e320: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
e330: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65   index to the le
e340: 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  ft.  ** of this 
e350: 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65  one, no estimate
e360: 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65   can be made. Re
e370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
e380: 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70  OUND. */.  if( p
e390: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e3a0: 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20  id<(nEq-1) ){.  
e3b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e3c0: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20  NOTFOUND;.  }.. 
e3d0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   /* This is an o
e3e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
e3f0: 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  . The call to sq
e400: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
e410: 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62  etValue().  ** b
e420: 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72  elow would retur
e430: 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  n the same value
e440: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e  .  */.  if( nEq>
e450: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  =p->nColumn ){. 
e460: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
e470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e480: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
e490: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
e4a0: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
e4b0: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
e4c0: 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62  pr, 1, nEq-1, &b
e4d0: 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  Ok);.  pBuilder-
e4e0: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
e4f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e500: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
e510: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
e520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
e530: 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72  OUND;.  pBuilder
e540: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45  ->nRecValid = nE
e550: 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74  q;..  whereKeySt
e560: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
e570: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48  Rec, 0, a);.  WH
e580: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
e590: 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
e5a0: 67 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25 64  gions %s(%d): %d
e5b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
e5c0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65          p->zName
e5d0: 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b  , nEq-1, (int)a[
e5e0: 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d  1]));.  *pnRow =
e5f0: 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75   a[1];.  .  retu
e600: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e610: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
e620: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
e630: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
e640: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e650: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
e660: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
e670: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
e680: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
e690: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
e6a0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
e6b0: 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
e6c0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
e6d0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
e6e0: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
e6f0: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
e700: 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
e710: 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
e720: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
e730: 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
e740: 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
e750: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
e760: 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
e770: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
e780: 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
e790: 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
e7a0: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
e7b0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
e7c0: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
e7d0: 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
e7e0: 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
e7f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
e800: 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
e810: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
e820: 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
e830: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
e840: 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
e850: 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
e860: 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
e870: 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
e880: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
e890: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
e8a0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
e8b0: 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
e8c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e8d0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
e8e0: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
e8f0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
e900: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
e910: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
e920: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e930: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c  ,     /* The val
e940: 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52  ue list on the R
e950: 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c  HS of "x IN (v1,
e960: 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20  v2,v3,...)" */. 
e970: 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
e980: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
e990: 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
e9a0: 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
e9b0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
e9c0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
e9d0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
e9e0: 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
e9f0: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
ea00: 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  (p->aiRowLogEst[
ea10: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  0]);.  int nRecV
ea20: 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
ea30: 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
ea40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ea50: 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
ea60: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
ea70: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
ea80: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
ea90: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
eaa0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
eab0: 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
eac0: 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
ead0: 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
eae0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
eaf0: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
eb20: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
eb30: 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
eb40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
eb50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
eb60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
eb70: 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52  ){.    nEst = nR
eb80: 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ow0;.    rc = wh
eb90: 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
eba0: 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
ebb0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
ebc0: 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20  xpr, &nEst);.   
ebd0: 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74   nRowEst += nEst
ebe0: 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
ebf0: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
ec00: 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66  Valid;.  }..  if
ec10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ec20: 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  ){.    if( nRowE
ec30: 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f  st > nRow0 ) nRo
ec40: 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  wEst = nRow0;.  
ec50: 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
ec60: 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
ec70: 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77  CE(0x10,("IN row
ec80: 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
ec90: 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  d\n", nRowEst));
eca0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ecb0: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
ecc0: 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
ecd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ece0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ecf0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
ed00: 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64  _STAT4 */...#ifd
ed10: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
ed20: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
ed30: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
ed40: 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a   a WhereTerm obj
ed50: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
ed60: 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e  id whereTermPrin
ed70: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
ed80: 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a  rm, int iTerm){.
ed90: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
eda0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
edb0: 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
edc0: 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65  -3d NULL\n", iTe
edd0: 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rm);.  }else{.  
ede0: 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
edf0: 0a 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74 5b  .    char zLeft[
ee00: 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  50];.    memcpy(
ee10: 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29  zType, "...", 4)
ee20: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
ee30: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
ee40: 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b  VIRTUAL ) zType[
ee50: 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66  0] = 'V';.    if
ee60: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
ee70: 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29  or & WO_EQUIV  )
ee80: 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b   zType[1] = 'E';
ee90: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
eea0: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
eeb0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
eec0: 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d  in) ) zType[2] =
eed0: 20 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'L';.    if( pT
eee0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
eef0: 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20   WO_SINGLE ){.  
ef00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ef10: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66  intf(sizeof(zLef
ef20: 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b  t),zLeft,"left={
ef30: 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
ef60: 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  r, pTerm->u.left
ef70: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c  Column);.    }el
ef80: 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
ef90: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
efa0: 29 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e 75  )!=0 && pTerm->u
efb0: 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20  .pOrInfo!=0 ){. 
efc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
efd0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
efe0: 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78  ft),zLeft,"index
eff0: 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20  able=0x%lld", . 
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70        pTerm->u.p
f020: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
f030: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
f050: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
f060: 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d  ft),zLeft,"left=
f070: 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74  %d", pTerm->left
f080: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
f090: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f0a0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 54  rintf(.       "T
f0b0: 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20 25  ERM-%-3d %p %s %
f0c0: 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f  -12s prob=%-3d o
f0d0: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
f0e0: 3d 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20 20  =0x%04x",.      
f0f0: 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a   iTerm, pTerm, z
f100: 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65  Type, zLeft, pTe
f110: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20  rm->truthProb,. 
f120: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
f130: 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77  erator, pTerm->w
f140: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  tFlags);.    if(
f150: 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29   pTerm->iField )
f160: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f170: 65 62 75 67 50 72 69 6e 74 66 28 22 20 69 46 69  ebugPrintf(" iFi
f180: 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d  eld=%d\n", pTerm
f190: 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d  ->iField);.    }
f1a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f1b0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f1c0: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
f1d0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
f1e0: 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45  xpr(0, pTerm->pE
f1f0: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23  xpr, 0);.  }.}.#
f200: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48  endif..#ifdef WH
f210: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
f220: 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20  ./*.** Show the 
f230: 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
f240: 20 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75 73   of a WhereClaus
f250: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
f260: 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
f270: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
f280: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
f290: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e  for(i=0; i<pWC->
f2a0: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
f2b0: 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
f2c0: 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a  &pWC->a[i], i);.
f2d0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
f2e0: 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
f2f0: 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72  ENABLED./*.** Pr
f300: 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  int a WhereLoop 
f310: 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67  object for debug
f320: 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ging purposes.*/
f330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f340: 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72  reLoopPrint(Wher
f350: 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43  eLoop *p, WhereC
f360: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57  lause *pWC){.  W
f370: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f380: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
f390: 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57    int nb = 1+(pW
f3a0: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
f3b0: 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72  nSrc+3)/4;.  str
f3c0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f3d0: 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f   *pItem = pWInfo
f3e0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
f3f0: 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65  p->iTab;.  Table
f400: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
f410: 70 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20  pTab;.  Bitmask 
f420: 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61 73  mAll = (((Bitmas
f430: 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20  k)1)<<(nb*4)) - 
f440: 31 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  1;.  sqlite3Debu
f450: 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
f460: 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
f470: 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
f480: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
f490: 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
f4a0: 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
f4b0: 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73  req & mAll);.  s
f4c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f4d0: 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
f500: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
f510: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f520: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
f530: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
f540: 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
f550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
f560: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
f570: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
f580: 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
f590: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
f5a0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
f5b0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
f5c0: 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
f5d0: 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
f5e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
f5f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f600: 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
f610: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
f620: 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
f630: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
f640: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
f650: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f660: 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
f670: 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
f680: 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
f690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f6a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f6b0: 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
f6c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
f6d0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
f6e0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
f6f0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
f700: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
f710: 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
f740: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
f750: 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
f760: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
f770: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
f780: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
f790: 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
f7a0: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
f7b0: 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
f7c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f7d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
f7e0: 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
f7f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
f800: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
f810: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
f820: 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
f830: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f840: 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
f850: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
f860: 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
f870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
f880: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f890: 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
f8a0: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
f8b0: 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
f8c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f8d0: 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
f8e0: 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
f8f0: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
f900: 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
f910: 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
f920: 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
f930: 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
f940: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f950: 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
f960: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
f970: 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
f980: 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
f990: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
f9a0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
f9b0: 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
f9c0: 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
f9d0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
f9e0: 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
f9f0: 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
fa00: 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
fa10: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
fa20: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
fa30: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
fa40: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
fa50: 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
fa60: 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
fa70: 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
fa80: 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
fa90: 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
faa0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
fab0: 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
fac0: 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
fad0: 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
fae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
faf0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
fb00: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
fb10: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
fb20: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
fb30: 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
fb40: 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
fb50: 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
fb60: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
fb70: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
fb80: 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
fb90: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
fba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
fbb0: 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
fbc0: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
fbd0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
fbe0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
fbf0: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
fc00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fc10: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
fc20: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
fc30: 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
fc40: 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
fc50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
fc60: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
fc70: 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
fc80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fc90: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e  DbFreeNN(db, p->
fca0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
fcb0: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
fcc0: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
fcd0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
fce0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
fcf0: 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
fd00: 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
fd10: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
fd20: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
fd30: 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
fd40: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
fd50: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
fd60: 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
fd70: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
fd80: 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  NN(db, p->aLTerm
fd90: 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  );.  whereLoopCl
fda0: 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b  earUnion(db, p);
fdb0: 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
fdc0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  (p);.}../*.** In
fdd0: 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  crease the memor
fde0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  y allocation for
fdf0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d   pLoop->aLTerm[]
fe00: 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
fe10: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
fe20: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
fe30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fe40: 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20  ereLoop *p, int 
fe50: 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  n){.  WhereTerm 
fe60: 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70  **paNew;.  if( p
fe70: 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65  ->nLSlot>=n ) re
fe80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fe90: 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a    n = (n+7)&~7;.
fea0: 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65    paNew = sqlite
feb0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
fec0: 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  b, sizeof(p->aLT
fed0: 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66  erm[0])*n);.  if
fee0: 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  ( paNew==0 ) ret
fef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ff00: 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28  _BKPT;.  memcpy(
ff10: 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
ff20: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
ff30: 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
ff40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
ff50: 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
ff60: 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
ff70: 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65  eeNN(db, p->aLTe
ff80: 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  rm);.  p->aLTerm
ff90: 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e   = paNew;.  p->n
ffa0: 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74  LSlot = n;.  ret
ffb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ffc0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
ffd0: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
ffe0: 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69  e second pLoop i
fff0: 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a  nto the first..*
10000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
10010 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74  reLoopXfer(sqlit
10020 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10030 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f  p *pTo, WhereLoo
10040 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65  p *pFrom){.  whe
10050 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
10060 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28  (db, pTo);.  if(
10070 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
10080 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d  (db, pTo, pFrom-
10090 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  >nLTerm) ){.    
100a0 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20  memset(&pTo->u, 
100b0 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75  0, sizeof(pTo->u
100c0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
100d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
100e0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70  ;.  }.  memcpy(p
100f0 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45  To, pFrom, WHERE
10100 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a  _LOOP_XFER_SZ);.
10110 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
10120 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54  Term, pFrom->aLT
10130 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  erm, pTo->nLTerm
10140 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54  *sizeof(pTo->aLT
10150 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  erm[0]));.  if( 
10160 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
10170 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
10180 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  BLE ){.    pFrom
10190 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
101a0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
101b0 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  f( (pFrom->wsFla
101c0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
101d0 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
101e0 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e   pFrom->u.btree.
101f0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
10200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10210 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
10220 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ete a WhereLoop 
10230 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
10240 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44   void whereLoopD
10250 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
10260 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
10270 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
10280 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c  ar(db, p);.  sql
10290 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
102a0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
102b0 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
102c0 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
102d0 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
102e0 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
102f0 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10300 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
10310 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
10320 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10330 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
10340 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
10350 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
10360 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
10370 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
10380 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
10390 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
103a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
103b0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
103c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
103d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
103e0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
103f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10400 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
10410 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
10420 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
10430 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
10440 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
10450 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
10460 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
10470 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
10480 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
10490 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
104a0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
104b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
104c0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
104d0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WInfo);.  }.}../
104e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
104f0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
10500 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
10510 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
10520 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  X has the same o
10530 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
10540 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20  t Y.**   (2)  X 
10550 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10560 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29  et of Y.**   (3)
10570 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61    X skips at lea
10580 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d  st as many colum
10590 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79  ns as Y.**.** By
105a0 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74 22   "proper subset"
105b0 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20   we mean that X 
105c0 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52 45  uses fewer WHERE
105d0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a   clause terms.**
105e0 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
105f0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
10600 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
10610 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a   X is also used.
10620 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49  ** by Y..**.** I
10630 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  f X is a proper 
10640 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e  subset of Y then
10650 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20 63   Y is a better c
10660 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a  hoice and ought.
10670 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77  ** to have a low
10680 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72  er cost.  This r
10690 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54  outine returns T
106a0 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f  RUE when that co
106b0 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73  st .** relations
106c0 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64 20  hip is inverted 
106d0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
106e0 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74  adjusted.  The t
106f0 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73  hird rule.** was
10700 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20 69   added because i
10710 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63  f X uses skip-sc
10720 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69  an less than Y i
10730 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a  t still might.**
10740 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72   deserve a lower
10750 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74   cost even if it
10760 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
10770 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61  set of Y..*/.sta
10780 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
10790 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
107a0 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68  bset(.  const Wh
107b0 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20  ereLoop *pX,    
107c0 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72     /* First Wher
107d0 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65  eLoop to compare
107e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72   */.  const Wher
107f0 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20  eLoop *pY       
10800 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69   /* Compare agai
10810 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f  nst this WhereLo
10820 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  op */.){.  int i
10830 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e  , j;.  if( pX->n
10840 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20  LTerm-pX->nSkip 
10850 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59  >= pY->nLTerm-pY
10860 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72  ->nSkip ){.    r
10870 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73  eturn 0; /* X is
10880 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
10890 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20   Y */.  }.  if( 
108a0 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e  pY->nSkip > pX->
108b0 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30  nSkip ) return 0
108c0 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e  ;.  if( pX->rRun
108d0 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a   >= pY->rRun ){.
108e0 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e      if( pX->rRun
108f0 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65   > pY->rRun ) re
10900 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
10910 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
10920 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d  Y */.    if( pX-
10930 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74  >nOut > pY->nOut
10940 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10950 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
10960 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  than Y */.  }.  
10970 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d  for(i=pX->nLTerm
10980 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
10990 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65      if( pX->aLTe
109a0 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rm[i]==0 ) conti
109b0 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70  nue;.    for(j=p
109c0 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  Y->nLTerm-1; j>=
109d0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69  0; j--){.      i
109e0 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  f( pY->aLTerm[j]
109f0 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  ==pX->aLTerm[i] 
10a00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
10a10 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74     if( j<0 ) ret
10a20 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74  urn 0;  /* X not
10a30 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73   a subset of Y s
10a40 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e  ince term X[i] n
10a50 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a  ot used by Y */.
10a60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20    }.  return 1; 
10a70 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f   /* All conditio
10a80 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a  ns meet */.}../*
10a90 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73  .** Try to adjus
10aa0 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68  t the cost of Wh
10ab0 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74  ereLoop pTemplat
10ac0 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77  e upwards or dow
10ad0 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61  nwards so.** tha
10ae0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70  t:.**.**   (1) p
10af0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c  Template costs l
10b00 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ess than any oth
10b10 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68  er WhereLoops th
10b20 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a  at are a proper.
10b30 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74 20  **       subset 
10b40 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a  of pTemplate.**.
10b50 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61  **   (2) pTempla
10b60 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68  te costs more th
10b70 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
10b80 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63  reLoops for whic
10b90 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20  h pTemplate.**  
10ba0 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65 72       is a proper
10bb0 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   subset..**.** T
10bc0 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70  o say "WhereLoop
10bd0 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73   X is a proper s
10be0 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e  ubset of Y" mean
10bf0 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  s that X uses fe
10c00 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  wer.** WHERE cla
10c10 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59  use terms than Y
10c20 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
10c30 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
10c40 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a  m used by X is.*
10c50 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59  * also used by Y
10c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10c70 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
10c80 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65  Cost(const Where
10c90 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f  Loop *p, WhereLo
10ca0 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
10cb0 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65    if( (pTemplate
10cc0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10cd0 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
10ce0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20  return;.  for(; 
10cf0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
10d00 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  p){.    if( p->i
10d10 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
10d20 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iTab ) continue;
10d30 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
10d40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
10d50 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69  EXED)==0 ) conti
10d60 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65  nue;.    if( whe
10d70 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
10d80 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65  perSubset(p, pTe
10d90 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  mplate) ){.     
10da0 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70   /* Adjust pTemp
10db0 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61  late cost downwa
10dc0 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
10dd0 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74   cheaper than it
10de0 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73  s .      ** subs
10df0 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57  et p. */.      W
10e00 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
10e10 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
10e20 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
10e30 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
10e60 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
10e70 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
10e80 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20  nOut-1));.      
10e90 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
10ea0 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
10eb0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10ec0 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a   = p->nOut - 1;.
10ed0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68      }else if( wh
10ee0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
10ef0 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d 70  operSubset(pTemp
10f00 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  late, p) ){.    
10f10 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
10f20 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61 72  plate cost upwar
10f30 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
10f40 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20  costlier than p 
10f50 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70  since.      ** p
10f60 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72  Template is a pr
10f70 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 70  oper subset of p
10f80 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
10f90 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
10fa0 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
10fb0 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
10fc0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
10fe0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
10ff0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
11000 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b  ->rRun, p->nOut+
11010 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
11020 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
11030 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
11040 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
11050 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d  >nOut + 1;.    }
11060 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
11070 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66  arch the list of
11080 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a   WhereLoops in *
11090 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66  ppPrev looking f
110a0 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  or one that can 
110b0 62 65 0a 2a 2a 20 72 65 70 6c 61 63 65 64 20 62  be.** replaced b
110c0 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
110d0 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
110e0 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73  f pTemplate does
110f0 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74   not belong on t
11100 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73  he WhereLoop lis
11110 74 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  t..** In other w
11120 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74  ords if pTemplat
11130 65 20 6f 75 67 68 74 20 74 6f 20 62 65 20 64 72  e ought to be dr
11140 6f 70 70 65 64 20 66 72 6f 6d 20 66 75 72 74 68  opped from furth
11150 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
11160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73  ..**.** If pX is
11170 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   a WhereLoop tha
11180 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  t pTemplate can 
11190 72 65 70 6c 61 63 65 2c 20 74 68 65 6e 20 72 65  replace, then re
111a0 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b  turn the.** link
111b0 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
111c0 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65  pX..**.** If pTe
111d0 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 72 65  mplate cannot re
111e0 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
111f0 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
11200 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
11210 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
11220 74 6f 20 74 68 65 20 6c 69 73 74 20 61 73 20 61  to the list as a
11230 20 6e 65 77 20 65 6e 74 72 79 2c 20 74 68 65 6e   new entry, then
11240 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
11250 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 69 6c  r to the.** tail
11260 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   of the list..*/
11270 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f  .static WhereLoo
11280 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e  p **whereLoopFin
11290 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72 65  dLesser(.  Where
112a0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20  Loop **ppPrev,. 
112b0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
112c0 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20   *pTemplate.){. 
112d0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
112e0 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29   for(p=(*ppPrev)
112f0 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e  ; p; ppPrev=&p->
11300 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70  pNextLoop, p=*pp
11310 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70  Prev){.    if( p
11320 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
11330 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53  e->iTab || p->iS
11340 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74  ortIdx!=pTemplat
11350 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20  e->iSortIdx ){. 
11360 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65       /* If eithe
11370 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53  r the iTab or iS
11380 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f  ortIdx values fo
11390 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20  r two WhereLoop 
113a0 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  are different.  
113b0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73      ** then thos
113c0 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65  e WhereLoops nee
113d0 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72  d to be consider
113e0 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
113f0 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20  Neither is.     
11400 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20   ** a candidate 
11410 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f  to replace the o
11420 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63  ther. */.      c
11430 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
11440 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72     /* In the cur
11450 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
11460 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20  ion, the rSetup 
11470 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
11480 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74  zero.    ** or t
11490 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64  he cost of build
114a0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
114b0 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61   index (NlogN) a
114c0 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20  nd the NlogN.   
114d0 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
114e0 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57  for compatible W
114f0 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20  hereLoops. */.  
11500 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
11510 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c  tup==0 || pTempl
11520 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a  ate->rSetup==0 .
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70   || p->rSetup==p
11550 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
11560 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72   );..    /* wher
11570 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20  eLoopAddBtree() 
11580 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73  always generates
11590 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65   and inserts the
115a0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
115b0 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72  .    ** case fir
115c0 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61  st.  Hence compa
115d0 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20  tible candidate 
115e0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72  WhereLoops never
115f0 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20   have a larger. 
11600 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61     ** rSetup. Ca
11610 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e  ll this SETUP-IN
11620 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61  VARIANT */.    a
11630 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
11640 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
11650 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  tup );..    /* A
11660 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e  ny loop using an
11670 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69   appliation-defi
11680 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52  ned index (or PR
11690 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20  IMARY KEY or.   
116a0 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   ** UNIQUE const
116b0 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20  raint) with one 
116c0 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74  or more == const
116d0 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65 72  raints is better
116e0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20  .    ** than an 
116f0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
11700 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20   Unless it is a 
11710 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20  skip-scan. */.  
11720 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
11730 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
11740 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26  NDEX)!=0.     &&
11750 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b   (pTemplate->nSk
11760 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ip)==0.     && (
11770 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
11780 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
11790 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ED)!=0.     && (
117a0 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
117b0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
117c0 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26  N_EQ)!=0.     &&
117d0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
117e0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
117f0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
11800 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  req.    ){.     
11810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11820 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e     /* If existin
11830 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73  g WhereLoop p is
11840 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65   better than pTe
11850 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74  mplate, pTemplat
11860 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  e can be.    ** 
11870 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65 72  discarded.  Wher
11880 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
11890 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  r if:.    **   (
118a0 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72  1)  p has no mor
118b0 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  e dependencies t
118c0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61  han pTemplate, a
118d0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
118e0 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20   p has an equal 
118f0 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
11900 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20  an pTemplate.   
11910 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
11920 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
11930 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e  te->prereq)==p->
11940 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29  prereq    /* (1)
11950 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e    */.     && p->
11960 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74  rSetup<=pTemplat
11970 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20 20  e->rSetup       
11980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11990 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
119a0 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
119b0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
119c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
119d0 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2b) */.     && p
119e0 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74  ->nOut<=pTemplat
119f0 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a10 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20  (2c) */.    ){. 
11a20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
11a30 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d 70  /* Discard pTemp
11a40 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  late */.    }.. 
11a50 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61     /* If pTempla
11a60 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65 74  te is always bet
11a70 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e  ter than p, then
11a80 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   cause p to be o
11a90 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  verwritten.    *
11aa0 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
11ab0 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  .  pTemplate is 
11ac0 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69 66  better than p if
11ad0 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
11ae0 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f  pTemplate has no
11af0 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65   more dependence
11b00 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20  s than p, and.  
11b10 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d    **   (2)  pTem
11b20 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71 75  plate has an equ
11b30 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  al or lower cost
11b40 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a   than p..    */.
11b50 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
11b60 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
11b70 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
11b80 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20  te->prereq   /* 
11b90 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20  (1)  */.     && 
11ba0 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61  p->rRun>=pTempla
11bb0 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20  te->rRun        
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bd0 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
11be0 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e       && p->nOut>
11bf0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20  (2b) */.    ){. 
11c30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
11c40 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
11c50 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20  e->rSetup ); /* 
11c60 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
11c70 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62  above */.      b
11c80 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65  reak;   /* Cause
11c90 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
11ca0 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74  tten by pTemplat
11cb0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e */.    }.  }. 
11cc0 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a   return ppPrev;.
11cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
11ce0 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65  or replace a Whe
11cf0 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69  reLoop entry usi
11d00 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ng the template 
11d10 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  supplied..**.** 
11d20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  An existing Wher
11d30 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68  eLoop entry migh
11d40 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  t be overwritten
11d50 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70   if the new temp
11d60 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65  late.** is bette
11d70 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20  r and has fewer 
11d80 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f  dependencies.  O
11d90 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77  r the template w
11da0 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a  ill be ignored.*
11db0 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20  * and no insert 
11dc0 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e  will occur if an
11dd0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11de0 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e  oop is faster an
11df0 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64  d has.** fewer d
11e00 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
11e10 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20   the template.  
11e20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20  Otherwise a new 
11e30 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20  WhereLoop is.** 
11e40 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74  added based on t
11e50 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  he template..**.
11e60 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  ** If pBuilder->
11e70 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55  pOrSet is not NU
11e80 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65 20  LL then we care 
11e90 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a  about only the.*
11ea0 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  * prerequisites 
11eb0 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75  and rRun and nOu
11ec0 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e  t costs of the N
11ed0 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68   best loops.  Th
11ee0 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  at.** informatio
11ef0 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e  n is gathered in
11f00 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70   the pBuilder->p
11f10 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  OrSet object.  T
11f20 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70  his special.** p
11f30 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69  rocessing mode i
11f40 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20  s used only for 
11f50 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
11f60 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  sing..**.** When
11f70 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75   accumulating mu
11f80 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68  ltiple loops (wh
11f90 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  en pBuilder->pOr
11fa0 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a  Set is NULL) we.
11fb0 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f  ** still might o
11fc0 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72  verwrite similar
11fd0 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20   loops with the 
11fe0 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20  new template if 
11ff0 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c  the.** new templ
12000 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20 20  ate is better.  
12010 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65  Loops may be ove
12020 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
12030 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f  following .** co
12040 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74  nditions are met
12050 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
12060 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
12070 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28  me iTab..**    (
12080 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  2)  They have th
12090 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e  e same iSortIdx.
120a0 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65 20  .**    (3)  The 
120b0 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d  template has sam
120c0 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e  e or fewer depen
120d0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
120e0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
120f0 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d      (4)  The tem
12100 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73 61  plate has the sa
12110 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  me or lower cost
12120 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
12130 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63  t loop.*/.static
12140 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e   int whereLoopIn
12150 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  sert(WhereLoopBu
12160 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
12170 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
12180 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c  plate){.  WhereL
12190 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70  oop **ppPrev, *p
121a0 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
121b0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
121c0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69  ->pWInfo;.  sqli
121d0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
121e0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
121f0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66  int rc;..  /* If
12200 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
12210 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
12220 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
12230 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
12240 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
12250 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
12260 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
12270 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
12280 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b  plate->nLTerm ){
12290 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
122a0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31  ENABLED.      u1
122b0 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
122c0 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20  pOrSet->n;.     
122d0 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
122e0 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
122f0 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f  ert(pBuilder->pO
12300 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rSet, pTemplate-
12310 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61  >prereq, pTempla
12320 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20  te->rRun,.      
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
12350 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a  emplate->nOut);.
12360 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12370 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12380 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12390 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
123a0 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
123b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
123c0 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
123d0 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
123e0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
123f0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
12400 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
12410 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
12420 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  dif.    }.    re
12430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12440 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
12450 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
12460 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
12470 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
12480 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
12490 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
124a0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
124b0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
124c0 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
124d0 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
124e0 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
124f0 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
12500 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
12510 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
12520 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
12530 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
12540 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
12550 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
12560 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
12570 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
12580 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12590 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
125a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
125b0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
125c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
125d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
125e0 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
125f0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
12600 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
12610 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
12620 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
12630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
12640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
12650 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
12660 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
12670 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
12680 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
12690 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
126a0 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
126b0 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
126c0 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
126d0 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
126e0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
126f0 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
12700 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
12710 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
12720 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
12730 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
12740 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
12750 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
12760 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
12770 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12780 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
12790 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
127a0 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
127b0 57 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  WC);.      sqlit
127c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
127d0 20 20 77 69 74 68 3a 20 22 29 3b 0a 20 20 20 20    with: ");.    
127e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
127f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12800 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
12810 20 20 7d 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f    }.    whereLoo
12820 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
12830 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12840 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
12850 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( p==0 ){.    /
12860 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
12870 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64   WhereLoop to ad
12880 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
12890 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  the list */.    
128a0 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71  *ppPrev = p = sq
128b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
128c0 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 68  NN(db, sizeof(Wh
128d0 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69  ereLoop));.    i
128e0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
128f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
12900 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  PT;.    whereLoo
12910 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70 2d  pInit(p);.    p-
12920 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a  >pNextLoop = 0;.
12930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
12940 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  We will be overw
12950 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  riting WhereLoop
12960 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f 72   p[].  But befor
12970 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a 20  e we do, first. 
12980 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68     ** go through
12990 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
129a0 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74 65   list and delete
129b0 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72 69   any other entri
129c0 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20 2a  es besides.    *
129d0 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20 61  * p[] that are a
129e0 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62 79  lso supplated by
129f0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
12a00 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
12a10 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74  Tail = &p->pNext
12a20 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65 4c  Loop;.    WhereL
12a30 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20  oop *pToDel;.   
12a40 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c 20   while( *ppTail 
12a50 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c 20  ){.      ppTail 
12a60 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
12a70 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70 54  esser(ppTail, pT
12a80 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  emplate);.      
12a90 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29 20  if( ppTail==0 ) 
12aa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
12ab0 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20  Del = *ppTail;. 
12ac0 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c 3d       if( pToDel=
12ad0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12ae0 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f 44    *ppTail = pToD
12af0 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23  el->pNextLoop;.#
12b00 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
12b10 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
12b20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12b30 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
12b40 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
12b50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12b60 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20  " delete: ");.  
12b70 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
12b80 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42 75  rint(pToDel, pBu
12b90 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
12ba0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12bb0 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74    whereLoopDelet
12bc0 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20  e(db, pToDel);. 
12bd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
12be0 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
12bf0 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
12c00 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
12c10 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
12c20 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
12c30 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
12c40 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
12c50 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
12c60 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
12c70 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
12c80 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
12c90 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
12ca0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12cb0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
12cc0 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75  he WhereLoop.nOu
12cd0 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64  t value downward
12ce0 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
12cf0 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
12d00 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
12d10 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
12d20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61  loop but which a
12d30 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61  re not used by a
12d40 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a  n.** index..*.**
12d50 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
12d60 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
12d70 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
12d80 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
12d90 64 20 77 68 69 63 68 20 68 61 73 20 61 20 74 72  d which has a tr
12da0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
12db0 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65 20  assigned by one 
12dc0 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  of the likelihoo
12dd0 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29  d(),.** likely()
12de0 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20  , or unlikely() 
12df0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72  SQL functions, r
12e00 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d 61  educe the estima
12e10 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  ted number.** of
12e20 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79 20   output rows by 
12e30 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
12e40 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
12e50 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76   TUNING:  For ev
12e60 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
12e70 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f   term that is no
12e80 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  t used by the in
12e90 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68  dex.** and which
12ea0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
12eb0 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75 74 68  n assigned truth
12ec0 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68 65   probability, he
12ed0 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73 63  uristics.** desc
12ee0 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65 20  ribed below are 
12ef0 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20 65  used to try to e
12f00 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75 74  stimate the trut
12f10 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a  h probability..*
12f20 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61  * TODO --> Perha
12f30 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65 74  ps this is somet
12f40 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64 20  hing that could 
12f50 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20 62  be improved by b
12f60 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73  etter.** table s
12f70 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a  tatistics..**.**
12f80 20 48 65 75 72 69 73 74 69 63 20 31 3a 20 20 45   Heuristic 1:  E
12f90 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75 74  stimate the trut
12fa0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73  h probability as
12fb0 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39 33   93.75%.  The 93
12fc0 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f  .75%.** value co
12fd0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20  rresponds to -1 
12fe0 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69  in LogEst notati
12ff0 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61 6e  on, so this mean
13000 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74  s decrement.** t
13010 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75  he WhereLoop.nOu
13020 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65 72  t field for ever
13030 79 20 73 75 63 68 20 57 48 45 52 45 20 63 6c 61  y such WHERE cla
13040 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  use term..**.** 
13050 48 65 75 72 69 73 74 69 63 20 32 3a 20 20 49 66  Heuristic 2:  If
13060 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
13070 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20  e or more WHERE 
13080 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
13090 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d  the.** form "x==
130a0 45 58 50 52 22 20 61 6e 64 20 45 58 50 52 20 69  EXPR" and EXPR i
130b0 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74  s not a constant
130c0 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61   0 or 1, then ma
130d0 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20 66  ke sure the.** f
130e0 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77 20  inal output row 
130f0 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20 67  estimate is no g
13100 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34 20  reater than 1/4 
13110 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  of the total num
13120 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69  ber.** of rows i
13130 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 6e  n the table.  In
13140 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73   other words, as
13150 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58 50  sume that x==EXP
13160 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a  R will filter.**
13170 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33 20   out at least 3 
13180 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20 20  out of 4 rows.  
13190 49 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f 72  If EXPR is -1 or
131a0 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61   0 or 1, then ma
131b0 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20 63  ybe the.** "x" c
131c0 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e  olumn is boolean
131d0 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20 30   or else -1 or 0
131e0 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f   or 1 is a commo
131f0 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a  n default value.
13200 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63 6f  ** on the "x" co
13210 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74  lumn and so in t
13220 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63 61  hat case only ca
13230 70 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  p the output row
13240 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20   estimate.** at 
13250 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20 31  1/2 instead of 1
13260 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  /4..*/.static vo
13270 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70  id whereLoopOutp
13280 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65 72  utAdjust(.  Wher
13290 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
132a0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
132b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
132c0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
132d0 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74     /* The loop t
132e0 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61 72  o adjust downwar
132f0 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52  d */.  LogEst nR
13300 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ow            /*
13310 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
13320 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  in the entire ta
13330 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
13340 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
13350 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  X;.  Bitmask not
13360 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f  Allowed = ~(pLoo
13370 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d  p->prereq|pLoop-
13380 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e  >maskSelf);.  in
13390 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67  t i, j, k;.  Log
133a0 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30 3b  Est iReduce = 0;
133b0 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f      /* pLoop->nO
133c0 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78  ut should not ex
133d0 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75 63  ceed nRow-iReduc
133e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
133f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
13400 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
13410 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  EX)==0 );.  for(
13420 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54  i=pWC->nTerm, pT
13430 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b  erm=pWC->a; i>0;
13440 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i--, pTerm++){.
13450 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
13460 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
13470 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65  IRTUAL)!=0 ) bre
13480 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ak;.    if( (pTe
13490 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
134a0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
134b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
134c0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
134d0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41  prereqAll & notA
134e0 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e  llowed)!=0 ) con
134f0 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
13500 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31  =pLoop->nLTerm-1
13510 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
13520 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e      pX = pLoop->
13530 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20  aLTerm[j];.     
13540 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e   if( pX==0 ) con
13550 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
13560 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72 65   pX==pTerm ) bre
13570 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ak;.      if( pX
13580 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26 20  ->iParent>=0 && 
13590 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61  (&pWC->a[pX->iPa
135a0 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20  rent])==pTerm ) 
135b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
135c0 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20   if( j<0 ){.    
135d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
135e0 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20  thProb<=0 ){.   
135f0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72 75       /* If a tru
13600 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 69  th probability i
13610 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e  s specified usin
13620 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64  g the likelihood
13630 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20 20  () hints,.      
13640 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74 68    ** then use th
13650 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70 72  e probability pr
13660 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61 70  ovided by the ap
13670 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  plication. */.  
13680 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75        pLoop->nOu
13690 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
136a0 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c  hProb;.      }el
136b0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
136c0 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
136d0 20 65 78 70 6c 69 63 69 74 20 74 72 75 74 68 20   explicit truth 
136e0 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20 75  probabilities, u
136f0 73 65 20 68 65 75 72 69 73 74 69 63 73 20 74 6f  se heuristics to
13700 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65 73  .        ** gues
13710 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 74  s a reasonable t
13720 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
13730 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
13740 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20  op->nOut--;.    
13750 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
13760 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c  Operator&(WO_EQ|
13770 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20  WO_IS) ){.      
13780 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
13790 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
137a0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
137b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
137c0 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rm->pExpr->op==T
137d0 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  K_IS );.        
137e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
137f0 72 49 73 49 6e 74 65 67 65 72 28 70 52 69 67 68  rIsInteger(pRigh
13800 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31  t, &k) && k>=(-1
13810 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20  ) && k<=1 ){.   
13820 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b           k = 10;
13830 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
13840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b 20  {.            k 
13850 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 20;.          
13860 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
13870 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65 64  iReduce<k ) iRed
13880 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20  uce = k;.       
13890 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
138a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
138b0 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52  ->nOut > nRow-iR
138c0 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e  educe )  pLoop->
138d0 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52  nOut = nRow - iR
138e0 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  educe;.}../* .**
138f0 20 54 65 72 6d 20 70 54 65 72 6d 20 69 73 20 61   Term pTerm is a
13900 20 76 65 63 74 6f 72 20 72 61 6e 67 65 20 63 6f   vector range co
13910 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
13920 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20 63 6f  on. The first co
13930 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74  mparison.** in t
13940 68 65 20 76 65 63 74 6f 72 20 63 61 6e 20 62 65  he vector can be
13950 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
13960 20 63 6f 6c 75 6d 6e 20 6e 45 71 20 6f 66 20 74   column nEq of t
13970 68 65 20 69 6e 64 65 78 2e 20 54 68 69 73 0a 2a  he index. This.*
13980 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
13990 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
139a0 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65 6c  ber of vector el
139b0 65 6d 65 6e 74 73 20 74 68 61 74 20 63 61 6e 20  ements that can 
139c0 62 65 20 75 73 65 64 0a 2a 2a 20 61 73 20 70 61  be used.** as pa
139d0 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
139e0 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a  comparison..**.*
139f0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
13a00 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
13a10 2a 2a 0a 2a 2a 20 20 20 57 48 45 52 45 20 61 20  **.**   WHERE a 
13a20 3d 20 3f 20 41 4e 44 20 28 62 2c 20 63 2c 20 64  = ? AND (b, c, d
13a30 29 20 3e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a  ) > (?, ?, ?).**
13a40 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65  .** and the inde
13a50 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  x:.**.**   CREAT
13a60 45 20 49 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20 28  E INDEX ... ON (
13a70 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 2a  a, b, c, d, e).*
13a80 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  *.** then this f
13a90 75 6e 63 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  unction would be
13aa0 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 45   invoked with nE
13ab0 71 3d 31 2e 20 54 68 65 20 76 61 6c 75 65 20 72  q=1. The value r
13ac0 65 74 75 72 6e 65 64 20 69 6e 0a 2a 2a 20 74 68  eturned in.** th
13ad0 69 73 20 63 61 73 65 20 69 73 20 33 2e 0a 2a 2f  is case is 3..*/
13ae0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
13af0 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
13b00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13b10 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
13b20 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13b30 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
13b40 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
13b50 70 65 6e 20 6f 6e 20 70 49 64 78 20 2a 2f 0a 20  pen on pIdx */. 
13b60 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
13b70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
13b80 65 78 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ex to be used fo
13b90 72 20 61 20 69 6e 65 71 75 61 6c 69 74 79 20 63  r a inequality c
13ba0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69  onstraint */.  i
13bb0 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20  nt nEq,         
13bc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13bd0 20 70 72 69 6f 72 20 65 71 75 61 6c 69 74 79 20   prior equality 
13be0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 73  constraints on s
13bf0 61 6d 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ame index */.  W
13c00 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
13c10 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f      /* The vecto
13c20 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  r inequality con
13c30 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
13c40 69 6e 74 20 6e 43 6d 70 20 3d 20 73 71 6c 69 74  int nCmp = sqlit
13c50 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
13c60 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  (pTerm->pExpr->p
13c70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
13c80 0a 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 43  .  nCmp = MIN(nC
13c90 6d 70 2c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75  mp, (pIdx->nColu
13ca0 6d 6e 20 2d 20 6e 45 71 29 29 3b 0a 20 20 66 6f  mn - nEq));.  fo
13cb0 72 28 69 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=1; i<nCmp; i
13cc0 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 65 73 74  ++){.    /* Test
13cd0 20 69 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   if comparison i
13ce0 20 6f 66 20 70 54 65 72 6d 20 69 73 20 63 6f 6d   of pTerm is com
13cf0 70 61 74 69 62 6c 65 20 77 69 74 68 20 63 6f 6c  patible with col
13d00 75 6d 6e 20 28 69 2b 6e 45 71 29 20 0a 20 20 20  umn (i+nEq) .   
13d10 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
13d20 2e 20 49 66 20 6e 6f 74 2c 20 65 78 69 74 20 74  . If not, exit t
13d30 68 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20  he loop.  */.   
13d40 20 63 68 61 72 20 61 66 66 3b 20 20 20 20 20 20   char aff;      
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13d60 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66  * Comparison aff
13d70 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 63 68 61  inity */.    cha
13d80 72 20 69 64 78 61 66 66 20 3d 20 30 3b 20 20 20  r idxaff = 0;   
13d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13da0 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 66  dexed columns af
13db0 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43 6f  finity */.    Co
13dc0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13de0 6f 6d 70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61 74  omparison collat
13df0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
13e00 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
13e10 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
13e20 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Left->x.pList->a
13e30 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
13e40 78 70 72 20 2a 70 52 68 73 20 3d 20 70 54 65 72  xpr *pRhs = pTer
13e50 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
13e60 3b 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  ;.    if( pRhs->
13e70 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
13e80 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70 52  lect ){.      pR
13e90 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70 53 65  hs = pRhs->x.pSe
13ea0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
13eb0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  i].pExpr;.    }e
13ec0 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 68 73 20  lse{.      pRhs 
13ed0 3d 20 70 52 68 73 2d 3e 78 2e 70 4c 69 73 74 2d  = pRhs->x.pList-
13ee0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
13ef0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
13f00 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 6f 66   that the LHS of
13f10 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
13f20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
13f30 72 65 6e 63 65 20 74 6f 0a 20 20 20 20 2a 2a 20  rence to.    ** 
13f40 74 68 65 20 72 69 67 68 74 20 63 6f 6c 75 6d 6e  the right column
13f50 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 73 6f   of the right so
13f60 75 72 63 65 20 74 61 62 6c 65 2e 20 41 6e 64 20  urce table. And 
13f70 74 68 61 74 20 74 68 65 20 73 6f 72 74 0a 20 20  that the sort.  
13f80 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68    ** order of th
13f90 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69  e index column i
13fa0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
13fb0 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  e sort order of 
13fc0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 6d  the.    ** leftm
13fd0 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  ost index column
13fe0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  .  */.    if( pL
13ff0 68 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  hs->op!=TK_COLUM
14000 4e 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d  N .     || pLhs-
14010 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 0a 20  >iTable!=iCur . 
14020 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f      || pLhs->iCo
14030 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn!=pIdx->aiCo
14040 6c 75 6d 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20 20  lumn[i+nEq] .   
14050 20 20 7c 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74    || pIdx->aSort
14060 4f 72 64 65 72 5b 69 2b 6e 45 71 5d 21 3d 70 49  Order[i+nEq]!=pI
14070 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
14080 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq].    ){.     
14090 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
140a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 68     testcase( pLh
140b0 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52  s->iColumn==XN_R
140c0 4f 57 49 44 20 29 3b 0a 20 20 20 20 61 66 66 20  OWID );.    aff 
140d0 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
140e0 41 66 66 69 6e 69 74 79 28 70 52 68 73 2c 20 73  Affinity(pRhs, s
140f0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
14100 74 79 28 70 4c 68 73 29 29 3b 0a 20 20 20 20 69  ty(pLhs));.    i
14110 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
14120 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
14130 74 79 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c  ty(pIdx->pTable,
14140 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b   pLhs->iColumn);
14150 0a 20 20 20 20 69 66 28 20 61 66 66 21 3d 69 64  .    if( aff!=id
14160 78 61 66 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20  xaff ) break;.. 
14170 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
14180 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
14190 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
141a0 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
141b0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 62  if( pColl==0 ) b
141c0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
141d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
141e0 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
141f0 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20  >azColl[i+nEq]) 
14200 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
14210 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
14220 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
14230 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
14240 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
14250 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
14260 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
14270 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
14280 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
14290 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
142a0 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
142b0 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
142c0 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
142d0 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
142e0 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
142f0 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
14300 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
14310 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
14320 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
14330 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14340 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
14350 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
14360 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
14370 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
14380 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
14390 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
143a0 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
143b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
143c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
143d0 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
143e0 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
143f0 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
14400 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
14410 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
14420 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
14430 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
14440 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
14450 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
14460 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
14470 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
14480 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
14490 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
144a0 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
144b0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
144c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
144d0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
144e0 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
144f0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
14500 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
14510 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
14520 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
14530 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
14540 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
14550 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
14560 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
14570 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14590 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
145a0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
145b0 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
145c0 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
145d0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
145e0 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
145f0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
14600 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
14610 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
14620 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
14630 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
14640 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
14650 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
14660 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
14670 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
14680 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14690 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
146a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
146b0 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
146c0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
146d0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
146e0 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
146f0 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
14700 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
14710 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14720 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
14730 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
14740 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
14750 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
14760 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
14770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
14780 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
14790 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
147a0 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
147b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
147c0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
147d0 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
147e0 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
147f0 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
14800 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
14810 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
14820 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
14830 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
14840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14850 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14860 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
14870 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
148a0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
148b0 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
148c0 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20 20   saved_nBtm;    
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148e0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
148f0 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
14900 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61  nBtm */.  u16 sa
14910 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20 20  ved_nTop;       
14920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14930 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14940 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
14950 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  p */.  u16 saved
14960 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20  _nSkip;         
14970 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14980 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14990 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32  ->nSkip */.  u32
149a0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20   saved_wsFlags; 
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149c0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
149d0 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  f pNew->wsFlags 
149e0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65  */.  LogEst save
149f0 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  d_nOut;         
14a00 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
14a10 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
14a20 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nOut */.  int rc
14a30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
14a50 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f  urn code */.  Lo
14a60 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a80 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
14a90 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
14aa0 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
14ab0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
14ac0 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
14ad0 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a  f table size */.
14ae0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
14af0 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30  p = 0, *pBtm = 0
14b00 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74  ; /* Top and bot
14b10 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  tom range constr
14b20 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77  aints */..  pNew
14b30 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
14b40 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  w;.  if( db->mal
14b50 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
14b60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
14b70 42 4b 50 54 3b 0a 20 20 57 48 45 52 45 54 52 41  BKPT;.  WHERETRA
14b80 43 45 28 30 78 38 30 30 2c 20 28 22 42 45 47 49  CE(0x800, ("BEGI
14b90 4e 20 61 64 64 42 74 72 65 65 49 64 78 28 25 73  N addBtreeIdx(%s
14ba0 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20  ), nEq=%d\n",.  
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65     pProbe->zName
14bd0 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  , pNew->u.btree.
14be0 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  nEq));..  assert
14bf0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
14c00 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
14c10 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61  TABLE)==0 );.  a
14c20 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
14c30 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
14c40 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20  P_LIMIT)==0 );. 
14c50 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
14c60 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
14c70 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61  IMIT ){.    opMa
14c80 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  sk = WO_LT|WO_LE
14c90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
14ca0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62  ssert( pNew->u.b
14cb0 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a  tree.nBtm==0 );.
14cc0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
14cd0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57  EQ|WO_IN|WO_GT|W
14ce0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
14cf0 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
14d00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f  ;.  }.  if( pPro
14d10 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  be->bUnordered )
14d20 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f   opMask &= ~(WO_
14d30 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
14d40 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74  O_LE);..  assert
14d50 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
14d60 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
14d70 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f  umn );..  saved_
14d80 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
14d90 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
14da0 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nBtm = pNew->u.
14db0 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61  btree.nBtm;.  sa
14dc0 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d  ved_nTop = pNew-
14dd0 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20  >u.btree.nTop;. 
14de0 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
14df0 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
14e00 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
14e10 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
14e20 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
14e30 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
14e40 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
14e50 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
14e60 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
14e70 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20  nOut;.  pTerm = 
14e80 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
14e90 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  can, pBuilder->p
14ea0 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  WC, pSrc->iCurso
14eb0 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20  r, saved_nEq,.  
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
14ee0 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72  robe);.  pNew->r
14ef0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69  Setup = 0;.  rSi
14f00 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
14f10 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72  owLogEst[0];.  r
14f20 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
14f30 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b  (rSize);.  for(;
14f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14f50 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72  & pTerm!=0; pTer
14f60 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78  m = whereScanNex
14f70 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75  t(&scan)){.    u
14f80 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e  16 eOp = pTerm->
14f90 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20  eOperator;   /* 
14fa0 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54  Shorthand for pT
14fb0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a  erm->eOperator *
14fc0 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f  /.    LogEst rCo
14fd0 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73  stIdx;.    LogEs
14fe0 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  t nOutUnadjusted
14ff0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74  ;        /* nOut
15000 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64   before IN() and
15010 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e   WHERE adjustmen
15020 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  ts */.    int nI
15030 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  n = 0;.#ifdef SQ
15040 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15050 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69  3_OR_STAT4.    i
15060 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70  nt nRecValid = p
15070 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
15080 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  id;.#endif.    i
15090 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55  f( (eOp==WO_ISNU
150a0 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
150b0 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
150c0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e  )!=0).     && in
150d0 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c  dexColumnNotNull
150e0 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e  (pProbe, saved_n
150f0 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
15100 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67   continue; /* ig
15110 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55  nore IS [NOT] NU
15120 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
15130 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
15140 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
15150 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
15160 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d  qRight & pNew->m
15170 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e  askSelf ) contin
15180 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  ue;..    /* Do n
15190 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70  ot allow the upp
151a0 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49  er bound of a LI
151b0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
151c0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
151d0 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77  .    ** to mix w
151e0 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67  ith a lower rang
151f0 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d  e bound from som
15200 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a  e other source *
15210 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
15220 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
15230 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d  LIKEOPT && pTerm
15240 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
15250 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  LT ) continue;..
15260 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
15270 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69 6e  low IS constrain
15280 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52  ts from the WHER
15290 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75  E clause to be u
152a0 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  sed by the.    *
152b0 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  * right table of
152c0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f   a LEFT JOIN.  O
152d0 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nly constraints 
152e0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
152f0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f   are.    ** allo
15300 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  wed */.    if( (
15310 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  pSrc->fg.jointyp
15320 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
15330 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
15340 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
15350 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
15360 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f 70  in).     && (eOp
15370 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e   & (WO_IS|WO_ISN
15380 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a  ULL))!=0.    ){.
15390 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
153a0 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20  eOp & WO_IS );. 
153b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
153c0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
153d0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
153e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
153f0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
15400 50 72 6f 62 65 29 20 26 26 20 73 61 76 65 64 5f  Probe) && saved_
15410 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65  nEq==pProbe->nKe
15420 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  yCol-1 ){.      
15430 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61  pBuilder->bldFla
15440 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c 44  gs |= SQLITE_BLD
15450 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  F_UNIQUE;.    }e
15460 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75 69 6c  lse{.      pBuil
15470 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d  der->bldFlags |=
15480 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44   SQLITE_BLDF_IND
15490 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  EXED;.    }.    
154a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
154b0 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20  saved_wsFlags;. 
154c0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
154d0 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71  .nEq = saved_nEq
154e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
154f0 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64  ree.nBtm = saved
15500 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  _nBtm;.    pNew-
15510 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
15520 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20  saved_nTop;.    
15530 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
15540 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
15550 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
15560 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
15570 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
15580 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
15590 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
155a0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
155b0 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
155c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
155d0 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
155e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
155f0 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
15600 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72  Self;..    asser
15610 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20  t( nInMul==0.   
15620 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
15630 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
15640 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a  OLUMN_NULL)!=0 .
15650 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77          || (pNew
15660 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
15670 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20  E_COLUMN_IN)!=0 
15680 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
15690 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
156a0 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20  RE_SKIPSCAN)!=0 
156b0 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
156c0 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a   eOp & WO_IN ){.
156d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
156e0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
156f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
15700 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
15710 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
15720 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
15730 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
15740 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
15750 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45      /* "x IN (SE
15760 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e  LECT ...)":  TUN
15770 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20  ING: the SELECT 
15780 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
15790 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
157a0 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20  ;.        nIn = 
157b0 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d  46;  assert( 46=
157c0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
157d0 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  5) );..        /
157e0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
157f0 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
15800 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78 2c   of the form (x,
15810 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e   y) IN (SELECT..
15820 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  .)..        ** I
15830 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
15840 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65 20  e is a separate 
15850 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f 66  term for each of
15860 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20 20   (x) and (y)..  
15870 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
15880 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69 70  , the nIn multip
15890 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  lier should only
158a0 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63 65   be applied once
158b0 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20 20  , not once.     
158c0 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20 73     ** for each s
158d0 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66 6f  uch term. The fo
158e0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68 65  llowing loop che
158f0 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20 69  cks that pTerm i
15900 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
15910 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72 6d   first such term
15920 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65 74   in use, and set
15930 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30 20  s nIn back to 0 
15940 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f  if it is not. */
15950 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
15960 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ; i<pNew->nLTerm
15970 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
15980 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c      if( pNew->aL
15990 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77 2d  Term[i] && pNew-
159a0 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70  >aLTerm[i]->pExp
159b0 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20 3d  r==pExpr ) nIn =
159c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
159d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
159e0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
159f0 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
15a00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
15a10 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
15a20 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
15a30 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20   ...)" */.      
15a40 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c    nIn = sqlite3L
15a50 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70  ogEst(pExpr->x.p
15a60 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
15a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49        assert( nI
15a80 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61  n>0 );  /* RHS a
15a90 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d  lways has 2 or m
15aa0 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68  ore terms...  Th
15ab0 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20  e parser.       
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78     ** changes "x
15ae0 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78   IN (?)" into "x
15af0 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  =?". */.      }.
15b00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
15b10 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
15b20 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
15b30 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Col = pProbe->ai
15b40 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71  Column[saved_nEq
15b50 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ];.      pNew->w
15b60 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15b70 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
15b80 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f 6e   assert( saved_n
15b90 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65  Eq==pNew->u.btre
15ba0 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20 69  e.nEq );.      i
15bb0 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  f( iCol==XN_ROWI
15bc0 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 43  D .       || (iC
15bd0 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  ol>0 && nInMul==
15be0 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d  0 && saved_nEq==
15bf0 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d  pProbe->nKeyCol-
15c00 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
15c10 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
15c20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e  && pProbe->uniqN
15c30 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
15c40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
15c50 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
15c60 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20 20  Q_WANTED;.      
15c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15c80 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15c90 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57   |= WHERE_ONEROW
15ca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15cb0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
15cc0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
15cd0 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  L ){.      pNew-
15ce0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
15cf0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
15d00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
15d10 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
15d20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
15d30 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54 20  se( eOp & WO_GT 
15d40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15d50 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20 29  e( eOp & WO_GE )
15d60 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
15d70 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
15d80 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
15d90 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
15da0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
15db0 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61 6e  .nBtm = whereRan
15dc0 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20  geVectorLen(.   
15dd0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
15de0 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  Src->iCursor, pP
15df0 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c  robe, saved_nEq,
15e00 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a   pTerm.      );.
15e10 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
15e20 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
15e30 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
15e40 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
15e50 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
15e60 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
15e70 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
15e80 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
15e90 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
15ea0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
15eb0 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
15ec0 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
15ed0 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
15ee0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15ef0 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
15f00 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
15f10 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
15f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
15f30 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
15f40 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
15f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
15f60 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
15f70 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
15f80 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
15f90 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
15fa0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
15fb0 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
15fc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
15fd0 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
15fe0 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
15ff0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
16000 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
16010 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
16020 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
16030 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  op = 1;.      }.
16040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16050 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
16060 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
16070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16080 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
16090 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
160a0 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
160b0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
160c0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
160d0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
160e0 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
160f0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
16100 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65  p = whereRangeVe
16110 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20  ctorLen(.       
16120 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d     pParse, pSrc-
16130 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65  >iCursor, pProbe
16140 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65  , saved_nEq, pTe
16150 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  rm.      );.    
16160 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a    pTop = pTerm;.
16170 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e        pBtm = (pN
16180 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
16190 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
161a0 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
161b0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
161c0 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
161d0 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d  rm-2] : 0;.    }
161e0 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
161f0 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75   point pNew->nOu
16200 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
16210 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
16220 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a  xpected to.    *
16230 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20  * be visited by 
16240 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62  the index scan b
16250 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e  efore considerin
16260 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72  g term pTerm, or
16270 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   the.    ** valu
16280 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49  es of nIn and nI
16290 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  nMul. In other w
162a0 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74  ords, assuming t
162b0 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hat all .    ** 
162c0 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d  "x IN(...)" term
162d0 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20 77  s are replaced w
162e0 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69  ith "x = ?". Thi
162f0 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a  s block updates.
16300 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
16310 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74   of pNew->nOut t
16320 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54  o account for pT
16330 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e  erm (but not nIn
16340 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20  /nInMul).  */.  
16350 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
16360 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
16370 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
16380 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
16390 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
163a0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
163b0 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61  t nOut using sta
163c0 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f  t3/stat4 data. O
163d0 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  r, if there is n
163e0 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20  o stat3/stat4.  
163f0 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69      ** data, usi
16400 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73  ng some other es
16410 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20  timate.  */.    
16420 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
16430 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
16440 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70  lder, pBtm, pTop
16450 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c  , pNew);.    }el
16460 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  se{.      int nE
16470 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74  q = ++pNew->u.bt
16480 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61  ree.nEq;.      a
16490 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
164a0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f  _ISNULL|WO_EQ|WO
164b0 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20  _IN|WO_IS) );.. 
164c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
164d0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
164e0 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Out );.      if(
164f0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
16500 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e  b<=0 && pProbe->
16510 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e  aiColumn[saved_n
16520 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eq]>=0 ){.      
16530 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20 26    assert( (eOp &
16540 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d   WO_IN) || nIn==
16550 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
16560 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
16570 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  IN );.        pN
16580 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  ew->nOut += pTer
16590 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
165a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
165b0 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d   -= nIn;.      }
165c0 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
165d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
165e0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20 20  _OR_STAT4.      
165f0 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d    tRowcnt nOut =
16600 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
16610 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20  nInMul==0 .     
16620 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e      && pProbe->n
16630 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
16640 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
16650 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e  e.nEq<=pProbe->n
16660 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20  SampleCol.      
16670 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57 4f     && ((eOp & WO
16680 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72  _IN)==0 || !Expr
16690 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
166a0 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  m->pExpr, EP_xIs
166b0 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20 20  Select)).       
166c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
166d0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
166e0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
166f0 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20 28      if( (eOp & (
16700 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_EQ|WO_ISNULL|
16710 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20 20  WO_IS))!=0 ){.  
16720 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16730 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51 20  se( eOp & WO_EQ 
16740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
16750 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
16760 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IS );.        
16770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
16780 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  p & WO_ISNULL );
16790 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
167a0 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  = whereEqualScan
167b0 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
167c0 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  lder, pExpr->pRi
167d0 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ght, &nOut);.   
167e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
167f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
16800 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
16810 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
16820 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
16830 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
16840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
16860 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c  FOUND ) rc = SQL
16870 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
16880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16890 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20 20  _OK ) break;    
168a0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75        /* Jump ou
168b0 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20 6c  t of the pTerm l
168c0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oop */.         
168d0 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20   if( nOut ){.   
168e0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
168f0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
16900 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20  Est(nOut);.     
16910 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
16920 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74  >nOut>saved_nOut
16930 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20   ) pNew->nOut = 
16940 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
16950 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
16960 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  ut -= nIn;.     
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 20 20 69 66 28 20 6e 4f 75  .        if( nOu
16990 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20 20  t==0 ).#endif.  
169a0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
169b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
169c0 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f  (pProbe->aiRowLo
169d0 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f  gEst[nEq] - pPro
169e0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
169f0 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20  nEq-1]);.       
16a00 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
16a10 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
16a20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
16a30 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
16a40 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c  likelihood() val
16a50 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ue, assume that 
16a60 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  a .            *
16a70 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20  * "col IS NULL" 
16a80 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
16a90 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e 79  es twice as many
16aa0 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20 20   rows .         
16ab0 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29     ** as (col=?)
16ac0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
16ad0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31   pNew->nOut += 1
16ae0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
16af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
16b10 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20 74  et rCostIdx to t
16b20 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
16b30 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f 77  ing selected row
16b40 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a  s in index. Add.
16b50 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65      ** it to pNe
16b60 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20 69  w->rRun, which i
16b70 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
16b80 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  to the cost of t
16b90 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  he index.    ** 
16ba0 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c  seek only. Then,
16bb0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   if this is a no
16bc0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
16bd0 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20 6f  , add the cost o
16be0 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69 6e  f.    ** visitin
16bf0 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  g the rows in th
16c00 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a  e main table.  *
16c10 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20 3d  /.    rCostIdx =
16c20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20   pNew->nOut + 1 
16c30 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a  + (15*pProbe->sz
16c40 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54  IdxRow)/pSrc->pT
16c50 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
16c60 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
16c70 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
16c80 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74 49  rLogSize, rCostI
16c90 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e  dx);.    if( (pN
16ca0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  ew->wsFlags & (W
16cb0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
16cc0 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a  ERE_IPK))==0 ){.
16cd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
16ce0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
16cf0 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
16d00 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29  pNew->nOut + 16)
16d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70 6c  ;.    }.    Appl
16d20 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
16d30 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f  pNew->rRun, pPro
16d40 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74  be->pTable->cost
16d50 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74  Mult);..    nOut
16d60 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e 65  Unadjusted = pNe
16d70 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65  w->nOut;.    pNe
16d80 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75  w->rRun += nInMu
16d90 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65  l + nIn;.    pNe
16da0 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75  w->nOut += nInMu
16db0 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65  l + nIn;.    whe
16dc0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
16dd0 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  st(pBuilder->pWC
16de0 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
16df0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
16e00 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
16e10 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  r, pNew);..    i
16e20 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
16e30 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
16e40 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 70  RANGE ){.      p
16e50 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
16e60 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  d_nOut;.    }els
16e70 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  e{.      pNew->n
16e80 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75  Out = nOutUnadju
16e90 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sted;.    }..   
16ea0 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
16eb0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
16ec0 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26  LIMIT)==0.     &
16ed0 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  & pNew->u.btree.
16ee0 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
16ef0 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  umn.    ){.     
16f00 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
16f10 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
16f20 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
16f30 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20  nInMul+nIn);.   
16f40 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75   }.    pNew->nOu
16f50 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
16f60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16f70 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
16f80 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72  AT4.    pBuilder
16f90 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
16fa0 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
16fb0 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72    }.  pNew->prer
16fc0 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65  eq = saved_prere
16fd0 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  q;.  pNew->u.btr
16fe0 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
16ff0 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  Eq;.  pNew->u.bt
17000 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64  ree.nBtm = saved
17010 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75  _nBtm;.  pNew->u
17020 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61  .btree.nTop = sa
17030 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65 77  ved_nTop;.  pNew
17040 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
17050 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77  nSkip;.  pNew->w
17060 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
17070 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  sFlags;.  pNew->
17080 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
17090 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  t;.  pNew->nLTer
170a0 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
170b0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  ;..  /* Consider
170c0 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63   using a skip-sc
170d0 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  an if there are 
170e0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
170f0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
17100 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
17110 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
17120 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ms of the index,
17130 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72   and if the aver
17140 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
17150 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68  of repeats in th
17160 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
17170 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38  s is at least 18
17180 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
17190 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38   magic number 18
171a0 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20   is selected on 
171b0 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73  the basis that s
171c0 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a  canning 17 rows.
171d0 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61    ** is almost a
171e0 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68  lways quicker th
171f0 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b  an an index seek
17200 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66   (even though if
17210 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
17220 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
17230 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65  han 2^17 rows we
17240 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73   assume otherwis
17250 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73  e in other parts
17260 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64   of.  ** the cod
17270 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66  e). And, even if
17280 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73   it is not, it s
17290 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f  hould not be too
172a0 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20   much slower. . 
172b0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
172c0 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61   hand, the extra
172d0 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64   seeks could end
172e0 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66   up being signif
172f0 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72  icantly.  ** mor
17300 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f  e expensive.  */
17310 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73  .  assert( 42==s
17320 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29  qlite3LogEst(18)
17330 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f   );.  if( saved_
17340 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70  nEq==saved_nSkip
17350 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71  .   && saved_nEq
17360 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  +1<pProbe->nKeyC
17370 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  ol.   && pProbe-
17380 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20  >noSkipScan==0. 
17390 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52    && pProbe->aiR
173a0 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
173b0 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55  Eq+1]>=42  /* TU
173c0 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f  NING: Minimum fo
173d0 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20  r skip-scan */. 
173e0 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65    && (rc = where
173f0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
17400 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
17410 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m+1))==SQLITE_OK
17420 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74  .  ){.    LogEst
17430 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77   nIter;.    pNew
17440 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
17450 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
17460 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
17470 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
17480 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
17490 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
174a0 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
174b0 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62     nIter = pProb
174c0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
174d0 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f  aved_nEq] - pPro
174e0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
174f0 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20  saved_nEq+1];.  
17500 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
17510 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55  nIter;.    /* TU
17520 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75  NING:  Because u
17530 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20  ncertainties in 
17540 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f  the estimates fo
17550 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72  r skip-scan quer
17560 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20  ies,.    ** add 
17570 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61  a 1.375 fudge fa
17580 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69  ctor to make ski
17590 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20  p-scan slightly 
175a0 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a  less likely. */.
175b0 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a      nIter += 5;.
175c0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
175d0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
175e0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
175f0 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75  e, nIter + nInMu
17600 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  l);.    pNew->nO
17610 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
17620 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
17630 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
17640 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  Eq;.    pNew->nS
17650 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
17660 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  p;.    pNew->wsF
17670 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
17680 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45  lags;.  }..  WHE
17690 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20 28  RETRACE(0x800, (
176a0 22 45 4e 44 20 61 64 64 42 74 72 65 65 49 64 78  "END addBtreeIdx
176b0 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63  (%s), nEq=%d, rc
176c0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
176e0 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76  robe->zName, sav
176f0 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a 20 20  ed_nEq, rc));.  
17700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17710 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20  .** Return True 
17720 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
17730 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69  e that pIndex mi
17740 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e  ght be useful in
17750 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
17760 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
17770 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72  ause in pBuilder
17780 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ..**.** Return F
17790 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72  alse if pBuilder
177a0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
177b0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
177c0 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68  ause or.** if th
177d0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
177e0 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75  r pIndex to be u
177f0 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65  seful in impleme
17800 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52  nting that.** OR
17810 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
17820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
17830 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
17840 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c  rderBy(.  WhereL
17850 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
17860 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70  lder,.  Index *p
17870 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75  Index,.  int iCu
17880 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69  rsor.){.  ExprLi
17890 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c  st *pOB;.  ExprL
178a0 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20  ist *aColExpr;. 
178b0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
178c0 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f  if( pIndex->bUno
178d0 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20  rdered ) return 
178e0 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  0;.  if( (pOB = 
178f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
17900 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29  ->pOrderBy)==0 )
17910 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
17920 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e  (ii=0; ii<pOB->n
17930 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
17940 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
17950 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
17960 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d  llate(pOB->a[ii]
17970 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
17980 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
17990 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
179a0 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20  iTable==iCursor 
179b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
179c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20  pr->iColumn<0 ) 
179d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
179e0 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
179f0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a  dex->nKeyCol; jj
17a00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17a10 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
17a20 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
17a30 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31  n[jj] ) return 1
17a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17a50 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70  lse if( (aColExp
17a60 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  r = pIndex->aCol
17a70 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  Expr)!=0 ){.    
17a80 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
17a90 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
17aa0 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
17ab0 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  f( pIndex->aiCol
17ac0 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52  umn[jj]!=XN_EXPR
17ad0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17ae0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17af0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
17b00 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a  r,aColExpr->a[jj
17b10 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29  ].pExpr,iCursor)
17b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
17b30 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17b40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17b50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17b60 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
17b70 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65  rn a bitmask whe
17b80 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74  re 1s indicate t
17b90 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
17ba0 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a  nding column of.
17bb0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
17bc0 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
17bd0 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
17be0 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65  t 63 columns are
17bf0 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
17c00 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
17c10 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e  olumnsInIndex(In
17c20 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
17c30 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
17c40 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
17c50 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
17c60 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
17c70 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
17c80 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66  olumn[j];.    if
17c90 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
17ca0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
17cb0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
17cc0 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29  case( x==BMS-2 )
17cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d  ;.      if( x<BM
17ce0 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42  S-1 ) m |= MASKB
17cf0 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(x);.    }.  }
17d00 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
17d10 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
17d20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
17d30 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
17d40 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
17d50 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
17d60 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
17d70 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
17d80 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
17d90 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
17da0 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
17db0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
17dc0 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
17dd0 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
17de0 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
17df0 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
17e00 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20  pTerm;.  while( 
17e10 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
17e20 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77  ND ){.    if( !w
17e30 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
17e40 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c  lIndex(iTab,pWC,
17e50 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29  pWhere->pLeft) )
17e60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
17e70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
17e80 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f  pRight;.  }.  fo
17e90 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
17ea0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
17eb0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
17ec0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
17ed0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
17ee0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
17ef0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
17f00 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20  (pExpr, pWhere, 
17f10 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28  iTab) .     && (
17f20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17f30 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
17f40 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
17f50 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
17f60 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20  iTab).    ){.   
17f70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17f80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17f90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
17fa0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
17fb0 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
17fc0 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
17fd0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
17fe0 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74  able.** is ident
17ff0 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  ified by pBuilde
18000 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
18010 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
18020 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
18030 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
18040 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
18050 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
18060 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f   costs (WhereLoo
18070 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62  p.rRun) of the b
18080 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65  -tree loops adde
18090 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
180a0 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c  on.** are calcul
180b0 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
180c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c  .**.** For a ful
180d0 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67  l scan, assuming
180e0 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69   the table (or i
180f0 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e  ndex) contains n
18100 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20  Row rows:.**.** 
18110 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
18120 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20  * 3.0           
18130 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c           // full
18140 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20  -table scan.**  
18150 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
18160 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
18170 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
18180 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  of covering inde
18190 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
181a0 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20  nRow * (K+3.0)  
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
181c0 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76   scan of non-cov
181d0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
181e0 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76  * where K is a v
181f0 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31  alue between 1.1
18200 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73   and 3.0 set bas
18210 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ed on the relati
18220 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ve .** estimated
18230 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
18240 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
18250 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  able records..**
18260 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78  .** For an index
18270 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69   scan, where nVi
18280 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  sit is the numbe
18290 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20  r of index rows 
182a0 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68  visited.** by th
182b0 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65  e scan, and nSee
182c0 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  k is the number 
182d0 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  of seek operatio
182e0 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a  ns required on .
182f0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  ** the index b-t
18300 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ree:.**.**     c
18310 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
18320 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e  og(nRow) + K * n
18330 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20  Visit)          
18340 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  // covering inde
18350 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
18360 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
18370 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e  w) + (K+3.0) * n
18380 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e  Visit)    // non
18390 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
183a0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
183b0 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65  nSeek is 1. nSee
183c0 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72  k values greater
183d0 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f   than 1 come abo
183e0 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48  ut if the .** WH
183f0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75  ERE clause inclu
18400 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29  des "x IN (....)
18410 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20  " terms used in 
18420 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20  place of "x=?". 
18430 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c  Or when .** impl
18440 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45  icit "x IN (SELE
18450 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20  CT x FROM tbl)" 
18460 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
18470 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a  for skip-scans..
18480 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
18490 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77  ted values (nRow
184a0 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29  , nVisit, nSeek)
184b0 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61   often contain a
184c0 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a   large amount.**
184d0 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e   of uncertainty.
184e0 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
184f0 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65  n, scoring is de
18500 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70  signed to pick p
18510 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f  lans that.** "do
18520 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22   the least harm"
18530 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65   if the estimate
18540 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65  s are inaccurate
18550 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
18560 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66  a.** log(nRow) f
18570 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64  actor is omitted
18580 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65   from a non-cove
18590 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
185a0 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62  in order to.** b
185b0 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20  ias the scoring 
185c0 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e  in favor of usin
185d0 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63  g an index, sinc
185e0 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  e the worst-case
185f0 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
18600 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
18610 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20  x is far better 
18620 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63  than the worst-c
18630 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ase performance.
18640 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  ** of a full tab
18650 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74  le scan..*/.stat
18660 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
18670 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
18680 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
18690 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
186a0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
186b0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
186c0 20 6d 50 72 65 72 65 71 20 20 20 20 20 20 20 20   mPrereq        
186d0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
186e0 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
186f0 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
18700 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
18710 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
18720 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
18730 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
18740 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
18750 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18760 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
18770 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
18780 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
187a0 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
187b0 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
187c0 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c  imary key */.  L
187d0 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b  ogEst aiRowEstPk
187e0 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  [2];       /* Th
187f0 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20  e aiRowLogEst[] 
18800 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
18810 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36  k index */.  i16
18820 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
18830 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
18840 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
18850 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
18860 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
18870 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
18880 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
18890 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
188a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
188b0 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
188c0 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
188d0 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
188e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
188f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18900 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
18910 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
18920 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18930 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
18940 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
18950 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
18960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18970 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
18980 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
18990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
189a0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
189b0 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
189c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
189d0 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
189e0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
189f0 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
18a00 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
18a10 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
18a20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
18a30 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
18a40 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
18a50 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
18a60 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
18a70 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18a80 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18aa0 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
18ab0 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ied */.  .  pNew
18ac0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
18ad0 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  w;.  pWInfo = pB
18ae0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
18af0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49    pTabList = pWI
18b00 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
18b10 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74   pSrc = pTabList
18b20 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
18b30 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
18b40 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70  >pTab;.  pWC = p
18b50 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
18b60 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
18b70 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
18b80 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  ;..  if( pSrc->p
18b90 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  IBIndex ){.    /
18ba0 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
18bb0 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
18bc0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
18bd0 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
18be0 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
18bf0 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  >pIBIndex;.  }el
18c00 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
18c10 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
18c20 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
18c30 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
18c40 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
18c50 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18c60 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
18c70 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
18c80 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
18c90 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
18ca0 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
18cb0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
18cc0 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
18cd0 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
18ce0 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
18cf0 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
18d00 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
18d10 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
18d20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
18d30 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
18d40 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d60 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
18d70 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
18d80 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
18d90 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
18da0 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
18db0 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
18dc0 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
18dd0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
18de0 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
18df0 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
18e00 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f  RowLogEst = aiRo
18e10 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
18e20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
18e30 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
18e40 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  able = pTab;.   
18e50 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20   sPk.szIdxRow = 
18e60 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
18e70 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
18e80 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ] = pTab->nRowLo
18e90 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  gEst;.    aiRowE
18ea0 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  stPk[1] = 0;.   
18eb0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
18ec0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
18ed0 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e    if( pSrc->fg.n
18ee0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
18ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
18f00 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
18f10 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
18f20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
18f30 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
18f40 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
18f50 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
18f60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18f70 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
18f80 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
18f90 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
18fa0 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
18fb0 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ze = pTab->nRowL
18fc0 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  ogEst;.  rLogSiz
18fd0 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
18fe0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
18ff0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
19000 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
19010 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
19020 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
19030 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f  r->pOrSet      /
19040 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  * Not part of an
19050 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
19060 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66   */.   && (pWInf
19070 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
19080 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
19090 53 45 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  SE)==0.   && (pW
190a0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
190b0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
190c0 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
190d0 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e    && pSrc->pIBIn
190e0 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48  dex==0      /* H
190f0 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  as no INDEXED BY
19100 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
19110 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e   !pSrc->fg.notIn
19120 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e  dexed   /* Has n
19130 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  o NOT INDEXED cl
19140 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61  ause */.   && Ha
19150 73 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20  sRowid(pTab)    
19160 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48       /* Not WITH
19170 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
19180 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74   (FIXME: Why not
19190 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  ?) */.   && !pSr
191a0 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  c->fg.isCorrelat
191b0 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ed /* Not a corr
191c0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
191d0 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
191e0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20  fg.isRecursive  
191f0 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69  /* Not a recursi
19200 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20  ve common table 
19210 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20  expression. */. 
19220 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
19230 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
19240 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
19250 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
19260 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
19270 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
19280 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
19290 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
192a0 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
192b0 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
192c0 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
192d0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
192e0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
192f0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
19300 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
19310 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
19320 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
19330 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
19340 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
19350 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
19360 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
19370 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19380 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
19390 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
193a0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
193b0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
193c0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
193d0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
193e0 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
193f0 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
19400 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
19410 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73  is.        ** es
19420 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a  timated to be X*
19430 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
19440 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
19450 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
19460 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
19470 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e  being indexed an
19480 64 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28  d where X is 7 (
19490 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e  LogEst=28) for n
194a0 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ormal.        **
194b0 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35   tables or 1.375
194c0 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20   (LogEst=4) for 
194d0 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
194e0 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65  ries.  The value
194f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58  .        ** of X
19500 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20   is smaller for 
19510 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
19520 72 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ries so that the
19530 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20   query planner. 
19540 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
19550 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76  e more aggressiv
19560 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69  e about generati
19570 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  ng automatic ind
19580 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20  exes for.       
19590 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74   ** those object
195a0 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  s, since there i
195b0 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79  s no opportunity
195c0 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20   to add schema. 
195d0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65         ** indexe
195e0 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20  s on subqueries 
195f0 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20  and views. */.  
19600 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
19610 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  up = rLogSize + 
19620 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20  rSize + 4;.     
19630 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
19640 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62  lect==0 && (pTab
19650 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
19660 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b  Ephemeral)==0 ){
19670 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
19680 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20  >rSetup += 24;. 
19690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
196a0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
196b0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75  lier(pNew->rSetu
196c0 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  p, pTab->costMul
196d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
196e0 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20 29  pNew->rSetup<0 )
196f0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
19700 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  0;.        /* TU
19710 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
19720 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
19730 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
19740 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
19750 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
19760 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
19770 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
19780 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
19790 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
197a0 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
197b0 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
197c0 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
197d0 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
197e0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
197f0 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
19800 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
19810 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
19820 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
19830 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
19840 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
19850 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
19860 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
19870 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
19880 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
19890 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
198a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
198b0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
198c0 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
198d0 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
198e0 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
198f0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
19900 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
19910 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
19920 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
19930 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
19940 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
19950 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
19960 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
19970 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a   all indices.  *
19980 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  /.  for(; rc==SQ
19990 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62  LITE_OK && pProb
199a0 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
199b0 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64  ->pNext, iSortId
199c0 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  x++){.    if( pP
199d0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
199e0 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21  ere!=0.     && !
199f0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
19a00 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43  alIndex(pSrc->iC
19a10 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f  ursor, pWC, pPro
19a20 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
19a30 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  e) ){.      test
19a40 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62  case( pNew->iTab
19a50 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
19a60 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65  );  /* See ticke
19a70 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a  t [98d973b8f5] *
19a80 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
19a90 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
19aa0 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
19ab0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
19ac0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53   */.    }.    rS
19ad0 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
19ae0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
19af0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
19b00 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
19b10 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
19b20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
19b30 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b  .btree.nTop = 0;
19b40 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
19b50 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19b60 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  nLTerm = 0;.    
19b70 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
19b80 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53   0;.    pNew->rS
19b90 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  etup = 0;.    pN
19ba0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72  ew->prereq = mPr
19bb0 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ereq;.    pNew->
19bc0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
19bd0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
19be0 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
19bf0 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
19c00 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
19c10 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
19c20 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
19c30 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
19c40 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
19c50 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
19c60 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
19c70 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
19c80 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
19c90 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
19ca0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
19cb0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
19cc0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
19cd0 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
19ce0 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
19cf0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
19d00 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
19d10 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
19d20 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
19d30 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
19d40 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
19d50 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
19d60 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
19d70 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
19d80 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
19d90 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
19da0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
19db0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
19dc0 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f  6;.      ApplyCo
19dd0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19de0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
19df0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
19e00 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
19e10 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
19e20 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72   rSize);.      r
19e30 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
19e40 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
19e50 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ew);.      pNew-
19e60 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
19e70 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
19e80 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
19e90 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
19ea0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
19eb0 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b  e->isCovering ){
19ec0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
19ed0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
19ee0 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
19ef0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20  INDEXED;.       
19f00 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   m = 0;.      }e
19f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d  lse{.        m =
19f20 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
19f30 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
19f40 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
19f50 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
19f60 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
19f70 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
19f80 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
19f90 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
19fa0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c   }..      /* Ful
19fb0 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78  l scan via index
19fc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a   */.      if( b.
19fd0 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
19fe0 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20  wid(pTab).      
19ff0 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72   || pProbe->pPar
1a000 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
1a010 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
1a020 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
1a030 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
1a040 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
1a050 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
1a060 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
1a070 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
1a080 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1a090 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
1a0a0 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
1a0b0 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
1a0c0 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
1a0d0 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
1a0e0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
1a0f0 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
1a100 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
1a110 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
1a120 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
1a130 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
1a140 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
1a150 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
1a160 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
1a170 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
1a180 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
1a190 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
1a1a0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
1a1b0 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
1a1c0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
1a1d0 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
1a1e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1a1f0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
1a200 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rows. */.       
1a210 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
1a220 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  ize + 1 + (15*pP
1a230 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
1a240 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
1a250 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30          if( m!=0
1a260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1a270 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   If this is a no
1a280 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
1a290 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74 68   scan, add in th
1a2a0 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20 20  e cost of.      
1a2b0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62      ** doing tab
1a2c0 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65  le lookups.  The
1a2d0 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33 78   cost will be 3x
1a2e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
1a2f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b           ** look
1a300 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20  ups.  Take into 
1a310 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63 6c  account WHERE cl
1a320 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
1a330 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20  can be.         
1a340 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73   ** satisfied us
1a350 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
1a360 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f 20  ex, and that do 
1a370 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20 20  not require a.  
1a380 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
1a390 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20   lookup. */.    
1a3a0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f        LogEst nLo
1a3b0 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20 31  okup = rSize + 1
1a3c0 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73 74  6;  /* Base cost
1a3d0 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20  :  N*3 */.      
1a3e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1a3f0 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
1a400 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a   pSrc->iCursor;.
1a410 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
1a420 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20 26 70  lause *pWC2 = &p
1a430 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20  WInfo->sWC;.    
1a440 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1a450 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20  ii<pWC2->nTerm; 
1a460 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
1a470 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1a480 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69  erm = &pWC2->a[i
1a490 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
1a4a0 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
1a4b0 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 70  CoveredByIndex(p
1a4c0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75  Term->pExpr, iCu
1a4d0 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  r, pProbe) ){.  
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1a4f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1a500 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1a510 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61  pTerm can be eva
1a520 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73  luated using jus
1a530 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f  t the index.  So
1a540 20 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20   reduce.        
1a550 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63      ** the expec
1a560 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  ted number of ta
1a570 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f  ble lookups acco
1a580 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20  rdingly */.     
1a590 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1a5a0 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
1a5b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a5c0 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d  nLookup += pTerm
1a5d0 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
1a5e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
1a600 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20  ookup--;.       
1a610 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1a620 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1a630 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c  O_EQ|WO_IS) ) nL
1a640 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20  ookup -= 19;.   
1a650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a670 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77   .          pNew
1a680 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1a690 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
1a6a0 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a  rRun, nLookup);.
1a6b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a6c0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
1a6d0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
1a6e0 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
1a6f0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1a700 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
1a710 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
1a720 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
1a730 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1a740 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1a750 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a760 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
1a770 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
1a780 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a790 20 20 7d 0a 0a 20 20 20 20 70 42 75 69 6c 64 65    }..    pBuilde
1a7a0 72 2d 3e 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b  r->bldFlags = 0;
1a7b0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
1a7c0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
1a7d0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
1a7e0 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20   pProbe, 0);.   
1a7f0 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 62   if( pBuilder->b
1a800 6c 64 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ldFlags==SQLITE_
1a810 42 4c 44 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a  BLDF_INDEXED ){.
1a820 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f        /* If a no
1a830 6e 2d 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69  n-unique index i
1a840 73 20 75 73 65 64 2c 20 6f 72 20 69 66 20 61 20  s used, or if a 
1a850 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6b 65  prefix of the ke
1a860 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75  y for.      ** u
1a870 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75  nique index is u
1a880 73 65 64 20 28 6d 61 6b 69 6e 67 20 74 68 65 20  sed (making the 
1a890 69 6e 64 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c  index functional
1a8a0 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20  ly non-unique). 
1a8b0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
1a8c0 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61   sqlite_stat1 da
1a8d0 74 61 20 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72  ta becomes impor
1a8e0 74 61 6e 74 20 66 6f 72 20 73 63 6f 72 69 6e 67  tant for scoring
1a8f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c   the.      ** pl
1a900 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  an */.      pTab
1a910 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1a920 5f 53 74 61 74 73 55 73 65 64 3b 0a 20 20 20 20  _StatsUsed;.    
1a930 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1a940 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
1a950 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65  STAT4.    sqlite
1a960 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28  3Stat4ProbeFree(
1a970 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b  pBuilder->pRec);
1a980 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
1a990 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  RecValid = 0;.  
1a9a0 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
1a9b0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
1a9c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1a9d0 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
1a9e0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c  clause, then onl
1a9f0 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78  y that one index
1aa00 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69   is.    ** consi
1aa10 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  dered. */.    if
1aa20 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  ( pSrc->pIBIndex
1aa30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1aa40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1aa50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1aa60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a  T_VIRTUALTABLE..
1aa70 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
1aa80 49 64 78 49 6e 66 6f 20 69 73 20 61 6c 72 65 61  IdxInfo is alrea
1aa90 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  dy populated wit
1aaa0 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  h all constraint
1aab0 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65  s that may.** be
1aac0 20 75 73 65 64 20 62 79 20 74 68 65 20 76 69 72   used by the vir
1aad0 74 75 61 6c 20 74 61 62 6c 65 20 69 64 65 6e 74  tual table ident
1aae0 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  ified by pBuilde
1aaf0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54  r->pNew->iTab. T
1ab00 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1ab10 6d 61 72 6b 73 20 61 20 73 75 62 73 65 74 20 6f  marks a subset o
1ab20 66 20 74 68 6f 73 65 20 63 6f 6e 73 74 72 61 69  f those constrai
1ab30 6e 74 73 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f  nts usable, invo
1ab40 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42 65 73 74  kes the.** xBest
1ab50 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 6e 64  Index method and
1ab60 20 61 64 64 73 20 74 68 65 20 72 65 74 75 72 6e   adds the return
1ab70 65 64 20 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c  ed plan to pBuil
1ab80 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e  der..**.** A con
1ab90 73 74 72 61 69 6e 74 20 69 73 20 6d 61 72 6b 65  straint is marke
1aba0 64 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a  d usable if:.**.
1abb0 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e 74 20  **   * Argument 
1abc0 6d 55 73 61 62 6c 65 20 69 6e 64 69 63 61 74 65  mUsable indicate
1abd0 73 20 74 68 61 74 20 69 74 73 20 70 72 65 72 65  s that its prere
1abe0 71 75 69 73 69 74 65 73 20 61 72 65 20 61 76 61  quisites are ava
1abf0 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  ilable, and.**.*
1ac00 2a 20 20 20 2a 20 49 74 20 69 73 20 6e 6f 74 20  *   * It is not 
1ac10 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
1ac20 74 6f 72 73 20 73 70 65 63 69 66 69 65 64 20 69  tors specified i
1ac30 6e 20 74 68 65 20 6d 45 78 63 6c 75 64 65 20 6d  n the mExclude m
1ac40 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20 20 20  ask passed.**   
1ac50 20 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20    as the fourth 
1ac60 61 72 67 75 6d 65 6e 74 20 28 77 68 69 63 68 20  argument (which 
1ac70 69 6e 20 70 72 61 63 74 69 63 65 20 69 73 20 65  in practice is e
1ac80 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30  ither WO_IN or 0
1ac90 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  )..**.** Argumen
1aca0 74 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d  t mPrereq is a m
1acb0 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
1acc0 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
1acd0 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a  ed before the.**
1ace0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1acf0 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54 68 65 73  n question. Thes
1ad00 65 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  e are added to t
1ad10 68 65 20 70 6c 61 6e 73 20 70 72 65 72 65 71 75  he plans prerequ
1ad20 69 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65  isites.** before
1ad30 20 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20   it is added to 
1ad40 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
1ad50 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
1ad60 20 2a 70 62 49 6e 20 69 73 20 73 65 74 20 74 6f   *pbIn is set to
1ad70 20 74 72 75 65 20 69 66 20 74 68 65 20 70 6c 61   true if the pla
1ad80 6e 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c  n added to pBuil
1ad90 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20  der.** uses one 
1ada0 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65  or more WO_IN te
1adb0 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  rms, or false ot
1adc0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1add0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1ade0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1adf0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1ae00 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 42  r *pBuilder,.  B
1ae10 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20  itmask mPrereq, 
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae30 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  * Mask of tables
1ae40 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 75 73   that must be us
1ae50 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ed. */.  Bitmask
1ae60 20 6d 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20   mUsable,       
1ae70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1ae80 20 6f 66 20 75 73 61 62 6c 65 20 74 61 62 6c 65   of usable table
1ae90 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c  s */.  u16 mExcl
1aea0 75 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ude,            
1aeb0 20 20 20 20 20 20 20 2f 2a 20 45 78 63 6c 75 64         /* Exclud
1aec0 65 20 74 65 72 6d 73 20 75 73 69 6e 67 20 74 68  e terms using th
1aed0 65 73 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ese operators */
1aee0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
1aef0 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c  _info *pIdxInfo,
1af00 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20     /* Populated 
1af10 6f 62 6a 65 63 74 20 66 6f 72 20 78 42 65 73 74  object for xBest
1af20 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6d  Index */.  u16 m
1af30 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20 20 20 20  NoOmit,         
1af40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1af50 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65 73 65 20   not omit these 
1af60 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1af70 20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20 20 20   int *pbIn      
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af90 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66   /* OUT: True if
1afa0 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 20 49 4e   plan uses an IN
1afb0 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20  (...) op */.){. 
1afc0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1afd0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
1afe0 43 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  C;.  struct sqli
1aff0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1b000 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
1b010 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
1b020 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1b030 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 20  t_usage *pUsage 
1b040 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
1b050 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
1b060 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54  int i;.  int mxT
1b070 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  erm;.  int rc = 
1b080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65  SQLITE_OK;.  Whe
1b090 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70  reLoop *pNew = p
1b0a0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1b0b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
1b0c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1b0d0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 74 72  o->pParse;.  str
1b0e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b0f0 20 2a 70 53 72 63 20 3d 20 26 70 42 75 69 6c 64   *pSrc = &pBuild
1b100 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62  er->pWInfo->pTab
1b110 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
1b120 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  ab];.  int nCons
1b130 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
1b140 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
1b150 0a 20 20 61 73 73 65 72 74 28 20 28 6d 55 73 61  .  assert( (mUsa
1b160 62 6c 65 20 26 20 6d 50 72 65 72 65 71 29 3d 3d  ble & mPrereq)==
1b170 6d 50 72 65 72 65 71 20 29 3b 0a 20 20 2a 70 62  mPrereq );.  *pb
1b180 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  In = 0;.  pNew->
1b190 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
1b1a0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1b1b0 75 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74  usable flag on t
1b1c0 68 65 20 73 75 62 73 65 74 20 6f 66 20 63 6f 6e  he subset of con
1b1d0 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66  straints identif
1b1e0 69 65 64 20 62 79 20 0a 20 20 2a 2a 20 61 72 67  ied by .  ** arg
1b1f0 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65 20 61  uments mUsable a
1b200 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a  nd mExclude. */.
1b210 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
1b220 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1b230 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
1b240 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
1b250 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
1b260 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1b270 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
1b280 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
1b290 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43  rm *pTerm = &pWC
1b2a0 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54  ->a[pIdxCons->iT
1b2b0 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ermOffset];.    
1b2c0 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
1b2d0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 70   = 0;.    if( (p
1b2e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
1b2f0 74 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54  t & mUsable)==pT
1b300 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1b310 20 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d   .     && (pTerm
1b320 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 45  ->eOperator & mE
1b330 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20 20 29  xclude)==0.    )
1b340 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  {.      pIdxCons
1b350 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
1b360 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e    }.  }..  /* In
1b370 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74  itialize the out
1b380 70 75 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  put fields of th
1b390 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
1b3a0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 2a  info structure *
1b3b0 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  /.  memset(pUsag
1b3c0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
1b3d0 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61  age[0])*nConstra
1b3e0 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  int);.  assert( 
1b3f0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1b400 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b  FreeIdxStr==0 );
1b410 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
1b420 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
1b430 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
1b440 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  .  pIdxInfo->ord
1b450 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
1b460 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
1b470 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
1b480 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
1b490 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49 64 78  double)2;.  pIdx
1b4a0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
1b4b0 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70 49 64 78  ows = 25;.  pIdx
1b4c0 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d  Info->idxFlags =
1b4d0 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1b4e0 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69 74  colUsed = (sqlit
1b4f0 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 63  e3_int64)pSrc->c
1b500 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e  olUsed;..  /* In
1b510 76 6f 6b 65 20 74 68 65 20 76 69 72 74 75 61 6c  voke the virtual
1b520 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64 65   table xBestInde
1b530 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  x() method */.  
1b540 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
1b550 65 78 28 70 50 61 72 73 65 2c 20 70 53 72 63 2d  ex(pParse, pSrc-
1b560 3e 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29  >pTab, pIdxInfo)
1b570 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1b580 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72  urn rc;..  mxTer
1b590 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74  m = -1;.  assert
1b5a0 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d  ( pNew->nLSlot>=
1b5b0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20  nConstraint );. 
1b5c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
1b5d0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
1b5e0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
1b5f0 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
1b600 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a  b.omitMask = 0;.
1b610 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
1b620 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1b630 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
1b640 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
1b650 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
1b660 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1b670 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
1b680 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65  ++){.    int iTe
1b690 72 6d 3b 0a 20 20 20 20 69 66 28 20 28 69 54 65  rm;.    if( (iTe
1b6a0 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61  rm = pUsage[i].a
1b6b0 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30  rgvIndex - 1)>=0
1b6c0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
1b6d0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
1b6e0 20 20 69 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f    int j = pIdxCo
1b6f0 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
1b700 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d  .      if( iTerm
1b710 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  >=nConstraint.  
1b720 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
1b730 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54     || j>=pWC->nT
1b740 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  erm.       || pN
1b750 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
1b760 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  ]!=0.       || p
1b770 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d  IdxCons->usable=
1b780 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
1b790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b7a0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 73  ERROR;.        s
1b7b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b7c0 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49  Parse,"%s.xBestI
1b7d0 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ndex malfunction
1b7e0 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  ",pSrc->pTab->zN
1b7f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ame);.        re
1b800 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1b810 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b820 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61   iTerm==nConstra
1b830 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  int-1 );.      t
1b840 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b  estcase( j==0 );
1b850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b860 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
1b870 20 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   );.      pTerm 
1b880 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
1b890 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1b8a0 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
1b8b0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  qRight;.      as
1b8c0 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
1b8d0 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
1b8e0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
1b8f0 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
1b900 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
1b910 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
1b920 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 74 65   iTerm;.      te
1b930 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
1b940 35 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  5 );.      testc
1b950 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29  ase( iTerm==16 )
1b960 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72  ;.      if( iTer
1b970 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1b980 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1b990 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1b9a0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1b9b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b9c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
1b9d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1b9e0 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
1b9f0 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
1ba00 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
1ba10 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
1ba20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
1ba30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1ba40 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
1ba50 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
1ba60 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 2a   terms.        *
1ba70 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
1ba80 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
1ba90 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
1baa0 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
1bab0 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c        ** (2) Mul
1bac0 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72  tiple outputs fr
1bad0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76  om a single IN v
1bae0 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65  alue will not me
1baf0 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  rge.        ** t
1bb00 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1bb10 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f       pIdxInfo->o
1bb20 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
1bb30 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78   0;.        pIdx
1bb40 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26  Info->idxFlags &
1bb50 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  = ~SQLITE_INDEX_
1bb60 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20  SCAN_UNIQUE;.   
1bb70 20 20 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20       *pbIn = 1; 
1bb80 61 73 73 65 72 74 28 20 28 6d 45 78 63 6c 75 64  assert( (mExclud
1bb90 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b  e & WO_IN)==0 );
1bba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bbb0 20 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61   }.  pNew->u.vta
1bbc0 62 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d  b.omitMask &= ~m
1bbd0 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d  NoOmit;..  pNew-
1bbe0 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d  >nLTerm = mxTerm
1bbf0 2b 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  +1;.  assert( pN
1bc00 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
1bc10 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e  ->nLSlot );.  pN
1bc20 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  ew->u.vtab.idxNu
1bc30 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  m = pIdxInfo->id
1bc40 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  xNum;.  pNew->u.
1bc50 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
1bc60 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1bc70 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 70 49  FreeIdxStr;.  pI
1bc80 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
1bc90 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
1bca0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1bcb0 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
1bcc0 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e  idxStr;.  pNew->
1bcd0 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
1bce0 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f   = (i8)(pIdxInfo
1bcf0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
1bd00 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78 49 6e  d ?.      pIdxIn
1bd10 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30  fo->nOrderBy : 0
1bd20 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  );.  pNew->rSetu
1bd30 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  p = 0;.  pNew->r
1bd40 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
1bd50 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  EstFromDouble(pI
1bd60 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1bd70 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  dCost);.  pNew->
1bd80 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
1bd90 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65  gEst(pIdxInfo->e
1bda0 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a  stimatedRows);..
1bdb0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57 48 45    /* Set the WHE
1bdc0 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69  RE_ONEROW flag i
1bdd0 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  f the xBestIndex
1bde0 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69 63 61  () method indica
1bdf0 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ted.  ** that th
1be00 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69  e scan will visi
1be10 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f  t at most one ro
1be20 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74 68 65  w. Clear it othe
1be30 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  rwise. */.  if( 
1be40 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61  pIdxInfo->idxFla
1be50 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45  gs & SQLITE_INDE
1be60 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b  X_SCAN_UNIQUE ){
1be70 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
1be80 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
1be90 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OW;.  }else{.   
1bea0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
1beb0 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  = ~WHERE_ONEROW;
1bec0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72  .  }.  rc = wher
1bed0 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1bee0 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69  lder, pNew);.  i
1bef0 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  f( pNew->u.vtab.
1bf00 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
1bf10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1bf20 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
1bf30 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  );.    pNew->u.v
1bf40 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1bf50 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  ;.  }.  WHERETRA
1bf60 43 45 28 30 78 66 66 66 66 2c 20 28 22 20 20 62  CE(0xffff, ("  b
1bf70 49 6e 3d 25 64 20 70 72 65 72 65 71 49 6e 3d 25  In=%d prereqIn=%
1bf80 30 34 6c 6c 78 20 70 72 65 72 65 71 4f 75 74 3d  04llx prereqOut=
1bf90 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20  %04llx\n",.     
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfb0 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74 65 33   *pbIn, (sqlite3
1bfc0 5f 75 69 6e 74 36 34 29 6d 50 72 65 72 65 71 2c  _uint64)mPrereq,
1bfd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bfe0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
1bff0 75 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e 70 72  uint64)(pNew->pr
1c000 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29  ereq & ~mPrereq)
1c010 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
1c020 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
1c030 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
1c040 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c  jects for a tabl
1c050 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64  e of the join id
1c060 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
1c070 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
1c080 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65  Tab.  That table
1c090 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1c0a0 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  o be a virtual t
1c0b0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
1c0c0 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54  here are no LEFT
1c0d0 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a   or CROSS JOIN j
1c0e0 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72  oins in the quer
1c0f0 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65 71 20  y, both mPrereq 
1c100 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  and.** mUnusable
1c110 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f   are set to 0. O
1c120 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65 72 65  therwise, mPrere
1c130 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61  q is a mask of a
1c140 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  ll FROM clause.*
1c150 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  * entries that o
1c160 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
1c170 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
1c180 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1c190 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61   and are.** sepa
1c1a0 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79  rated from it by
1c1b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45   at least one LE
1c1c0 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
1c1d0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
1c1e0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61  .** mUnusable ma
1c1f0 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  sk contains all 
1c200 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
1c210 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61  ies that occur a
1c220 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74  fter the.** virt
1c230 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72  ual table and ar
1c240 65 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  e separated from
1c250 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
1c260 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20  one LEFT or .** 
1c270 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a  CROSS JOIN. .**.
1c280 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1c290 69 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72  if the query wer
1c2a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  e:.**.**   ... F
1c2b0 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20  ROM t1, t2 LEFT 
1c2c0 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20  JOIN t3, t4, vt 
1c2d0 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74  CROSS JOIN t5, t
1c2e0 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50  6;.**.** then mP
1c2f0 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f 6e 64  rereq correspond
1c300 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e  s to (t1, t2) an
1c310 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28  d mUnusable to (
1c320 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41  t5, t6)..**.** A
1c330 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  ll the tables in
1c340 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20 62 65   mPrereq must be
1c350 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1c360 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74  the current virt
1c370 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53  ual .** table. S
1c380 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20  o any terms for 
1c390 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65 71  which all prereq
1c3a0 75 69 73 69 74 65 73 20 61 72 65 20 73 61 74 69  uisites are sati
1c3b0 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72  sfied by .** mPr
1c3c0 65 72 65 71 20 6d 61 79 20 62 65 20 73 70 65 63  ereq may be spec
1c3d0 69 66 69 65 64 20 61 73 20 22 75 73 61 62 6c 65  ified as "usable
1c3e0 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74  " in all calls t
1c3f0 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a  o xBestIndex. .*
1c400 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c  * Conversely, al
1c410 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75  l tables in mUnu
1c420 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73 63  sable must be sc
1c430 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  anned after the 
1c440 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75  current.** virtu
1c450 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79  al table, so any
1c460 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
1c470 20 74 68 65 20 70 72 65 72 65 71 75 69 73 69 74   the prerequisit
1c480 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68 0a  es overlap with.
1c490 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f  ** mUnusable sho
1c4a0 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6f  uld always be co
1c4b0 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f 74  nfigured as "not
1c4c0 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42 65  -usable" for xBe
1c4d0 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  stIndex..*/.stat
1c4e0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1c4f0 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68  AddVirtual(.  Wh
1c500 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1c510 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48  pBuilder,  /* WH
1c520 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72  ERE clause infor
1c530 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d  mation */.  Bitm
1c540 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20  ask mPrereq,    
1c550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1c560 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1c570 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
1c580 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74  his one */.  Bit
1c590 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20  mask mUnusable  
1c5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1c5b0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1c5c0 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
1c5d0 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20  his one */.){.  
1c5e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c5f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1c600 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c610 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1c620 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
1c630 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
1c640 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
1c650 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1c660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c670 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1c680 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1c690 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
1c6a0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1c6b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1c6c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c6d0 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
1c6e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1c6f0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1c700 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1c710 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20  fo *p;       /* 
1c720 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20 74  Object to pass t
1c730 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 2a  o xBestIndex() *
1c740 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  /.  int nConstra
1c750 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
1c760 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
1c770 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20 2a  nstraints in p *
1c780 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20 20  /.  int bIn;    
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7a0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61 6e   /* True if plan
1c7b0 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70   uses IN(...) op
1c7c0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72  erator */.  Wher
1c7d0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42  eLoop *pNew;.  B
1c7e0 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20 20  itmask mBest;   
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c800 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 62 65  ables used by be
1c810 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e  st possible plan
1c820 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69   */.  u16 mNoOmi
1c830 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d  t;..  assert( (m
1c840 50 72 65 72 65 71 20 26 20 6d 55 6e 75 73 61 62  Prereq & mUnusab
1c850 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e  le)==0 );.  pWIn
1c860 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1c870 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
1c880 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1c890 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
1c8a0 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20  er->pWC;.  pNew 
1c8b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1c8c0 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e  ;.  pSrc = &pWIn
1c8d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1c8e0 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61  pNew->iTab];.  a
1c8f0 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
1c900 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
1c910 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e    p = allocateIn
1c920 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
1c930 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20  pWC, mUnusable, 
1c940 70 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e  pSrc, pBuilder->
1c950 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  pOrderBy, .     
1c960 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69 66   &mNoOmit);.  if
1c970 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1c980 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1c990 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  T;.  pNew->rSetu
1c9a0 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77  p = 0;.  pNew->w
1c9b0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
1c9c0 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70  IRTUALTABLE;.  p
1c9d0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
1c9e0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1c9f0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1ca00 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d  nConstraint = p-
1ca10 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
1ca20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
1ca30 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ize(pParse->db, 
1ca40 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
1ca50 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
1ca60 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1ca70 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74 75  db, p);.    retu
1ca80 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
1ca90 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1caa0 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73 74  First call xBest
1cab0 49 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c  Index() with all
1cac0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61   constraints usa
1cad0 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54  ble. */.  WHERET
1cae0 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1caf0 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75  irtualOne: all u
1cb00 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63  sable\n"));.  rc
1cb10 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1cb20 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64  irtualOne(pBuild
1cb30 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c  er, mPrereq, ALL
1cb40 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f  BITS, 0, p, mNoO
1cb50 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f  mit, &bIn);..  /
1cb60 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
1cb70 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69   xBestIndex() wi
1cb80 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61  th all terms ena
1cb90 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61 20  bled produced a 
1cba0 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64  plan.  ** that d
1cbb0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
1cbc0 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c 65  any source table
1cbd0 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77  s (IOW: a plan w
1cbe0 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20  ith mBest==0),. 
1cbf0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
1cc00 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61  s no point in ma
1cc10 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65 72  king any further
1cc20 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1cc30 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e  ndex() .  ** sin
1cc40 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  ce they will all
1cc50 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
1cc60 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65 20   result (if the 
1cc70 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20 2a  xBestIndex().  *
1cc80 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1cc90 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20   is sane). */.  
1cca0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ccb0 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28 70  K && (mBest = (p
1ccc0 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d  New->prereq & ~m
1ccd0 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a 20  Prereq))!=0 ){. 
1cce0 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20     int seenZero 
1ccf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1cd00 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 6c   /* True if a pl
1cd10 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65  an with no prere
1cd20 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  qs seen */.    i
1cd30 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20  nt seenZeroNoIN 
1cd40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1cd50 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65  Plan with no pre
1cd60 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e  reqs and no IN(.
1cd70 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  ..) seen */.    
1cd80 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20  Bitmask mPrev = 
1cd90 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  0;.    Bitmask m
1cda0 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20  BestNoIn = 0;.. 
1cdb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c 61     /* If the pla
1cdc0 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68  n produced by th
1cdd0 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 75  e earlier call u
1cde0 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74  ses an IN(...) t
1cdf0 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  erm, call.    **
1ce00 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61 69   xBestIndex agai
1ce10 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74  n, this time wit
1ce20 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20  h IN(...) terms 
1ce30 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
1ce40 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20 20   if( bIn ){.    
1ce50 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1ce60 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1ce70 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f  e: all usable w/
1ce80 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20  o IN\n"));.     
1ce90 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1cea0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1ceb0 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1cec0 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49  , mPrereq, ALLBI
1ced0 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e  TS, WO_IN, p, mN
1cee0 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1cef0 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d      assert( bIn=
1cf00 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73  =0 );.      mBes
1cf10 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72  tNoIn = pNew->pr
1cf20 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b  ereq & ~mPrereq;
1cf30 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74  .      if( mBest
1cf40 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIn==0 ){.     
1cf50 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1cf60 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1cf70 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  oNoIN = 1;.     
1cf80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1cf90 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   Call xBestIndex
1cfa0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64   once for each d
1cfb0 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66  istinct value of
1cfc0 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26 20   (prereqRight & 
1cfd0 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a  ~mPrereq) .    *
1cfe0 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  * in the set of 
1cff0 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79  terms that apply
1d000 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1d010 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
1d020 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  */.    while( rc
1d030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d040 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1d050 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20    Bitmask mNext 
1d060 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20  = ALLBITS;.     
1d070 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30   assert( mNext>0
1d080 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1d090 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1d0a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1d0b0 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20  Bitmask mThis = 
1d0c0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57  (.            pW
1d0d0 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61  C->a[p->aConstra
1d0e0 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
1d0f0 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20  et].prereqRight 
1d100 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20  & ~mPrereq.     
1d110 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1d120 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26  ( mThis>mPrev &&
1d130 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d   mThis<mNext ) m
1d140 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20  Next = mThis;.  
1d150 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65      }.      mPre
1d160 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20  v = mNext;.     
1d170 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42   if( mNext==ALLB
1d180 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ITS ) break;.   
1d190 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42     if( mNext==mB
1d1a0 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42  est || mNext==mB
1d1b0 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e  estNoIn ) contin
1d1c0 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
1d1d0 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1d1e0 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76  irtualOne: mPrev
1d1f0 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30  =%04llx mNext=%0
1d200 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  4llx\n",.       
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1d230 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f  mPrev, (sqlite3_
1d240 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a  uint64)mNext));.
1d250 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1d260 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1d270 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  e(.          pBu
1d280 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1d290 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20 30  mNext|mPrereq, 0
1d2a0 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1d2b0 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  In);.      if( p
1d2c0 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72  New->prereq==mPr
1d2d0 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ereq ){.        
1d2e0 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1d2f0 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30        if( bIn==0
1d300 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20   ) seenZeroNoIN 
1d310 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1d320 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d330 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1d340 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20 61  Index() in the a
1d350 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f  bove loop did no
1d360 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20  t find a plan.  
1d370 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72    ** that requir
1d380 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62  es no source tab
1d390 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e  les at all (i.e.
1d3a0 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64 20   one guaranteed 
1d3b0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73 61  to be.    ** usa
1d3c0 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c  ble), make a cal
1d3d0 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c 20  l here with all 
1d3e0 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64 69  source tables di
1d3f0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  sabled */.    if
1d400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d410 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29  && seenZero==0 )
1d420 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1d430 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1d440 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73  tualOne: all dis
1d450 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20  abled\n"));.    
1d460 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d470 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1d480 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1d490 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65  r, mPrereq, mPre
1d4a0 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d  req, 0, p, mNoOm
1d4b0 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1d4c0 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65   if( bIn==0 ) se
1d4d0 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1d4e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d4f0 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42   the calls to xB
1d500 65 73 74 49 6e 64 65 78 28 29 20 68 61 76 65 20  estIndex() have 
1d510 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f  so far failed to
1d520 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20   find a plan.   
1d530 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65   ** that require
1d540 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c  s no source tabl
1d550 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f  es at all and do
1d560 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e  es not use an IN
1d570 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65  (...).    ** ope
1d580 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69  rator, make a fi
1d590 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61  nal call to obta
1d5a0 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f  in one here.  */
1d5b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d5c0 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65  ITE_OK && seenZe
1d5d0 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20  roNoIN==0 ){.   
1d5e0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1d5f0 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1d600 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64  ne: all disabled
1d610 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29   and w/o IN\n"))
1d620 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1d630 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1d640 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1d650 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1d660 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e  , mPrereq, WO_IN
1d670 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62  , p, mNoOmit, &b
1d680 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  In);.    }.  }..
1d690 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46    if( p->needToF
1d6a0 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
1d6b0 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53  te3_free(p->idxS
1d6c0 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  tr);.  sqlite3Db
1d6d0 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64  FreeNN(pParse->d
1d6e0 62 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  b, p);.  return 
1d6f0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
1d700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1d710 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
1d720 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
1d730 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
1d740 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
1d750 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
1d760 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
1d770 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
1d780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1d790 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20  hereLoopAddOr(. 
1d7a0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1d7b0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20  r *pBuilder, .  
1d7c0 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1d7d0 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75   .  Bitmask mUnu
1d7e0 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65  sable.){.  Where
1d7f0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
1d800 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
1d810 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1d820 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
1d830 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
1d840 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
1d850 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
1d860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1d870 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
1d880 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
1d890 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1d8a0 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
1d8b0 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
1d8c0 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ur;.  struct Src
1d8d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1d8e0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
1d8f0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57  ilder->pWC;.  pW
1d900 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
1d910 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
1d920 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1d930 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  New;.  memset(&s
1d940 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Sum, 0, sizeof(s
1d950 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d  Sum));.  pItem =
1d960 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1d970 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
1d980 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  b;.  iCur = pIte
1d990 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66  m->iCursor;..  f
1d9a0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
1d9b0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26   pTerm<pWCEnd &&
1d9c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1d9d0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
1d9e0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1d9f0 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a  tor & WO_OR)!=0.
1da00 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
1da10 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
1da20 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73  able & pNew->mas
1da30 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29  kSelf)!=0 .    )
1da40 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
1da50 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
1da60 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
1da70 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
1da80 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
1da90 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
1daa0 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
1dab0 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
1dac0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
1dad0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  .      int once 
1dae0 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
1daf0 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  , j;.    .      
1db00 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75  sSubBuild = *pBu
1db10 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75  ilder;.      sSu
1db20 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20  bBuild.pOrderBy 
1db30 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42  = 0;.      sSubB
1db40 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73  uild.pOrSet = &s
1db50 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52  Cur;..      WHER
1db60 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1db70 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  Begin processing
1db80 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
1db90 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  , pTerm));.     
1dba0 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
1dbb0 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
1dbc0 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
1dbd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1dbe0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
1dbf0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
1dc00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1dc10 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1dc20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
1dc30 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
1dc40 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
1dc50 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1dc60 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
1dc70 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
1dc80 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
1dc90 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1dca0 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
1dcb0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
1dcc0 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
1dcd0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
1dce0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
1dcf0 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
1dd00 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
1dd10 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1dd20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
1dd30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dd40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1dd50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
1dd60 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66  ur.n = 0;.#ifdef
1dd70 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
1dd80 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52  LED.        WHER
1dd90 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1dda0 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70  OR-term %d of %p
1ddb0 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73   has %d subterms
1ddc0 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  :\n", .         
1ddd0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
1dde0 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61  pOrTerm-pOrWC->a
1ddf0 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75  ), pTerm, sSubBu
1de00 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29  ild.pWC->nTerm))
1de10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1de20 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
1de30 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
1de40 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1de50 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53 75  eClausePrint(sSu
1de60 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20  bBuild.pWC);.   
1de70 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69       }.#endif.#i
1de80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1de90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1dea0 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
1deb0 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
1dec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
1ded0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1dee0 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69  Virtual(&sSubBui
1def0 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  ld, mPrereq, mUn
1df00 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1df10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1df20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1df30 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1df40 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1df50 69 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  ild, mPrereq);. 
1df60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1df80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1df90 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1dfa0 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20  dOr(&sSubBuild, 
1dfb0 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62  mPrereq, mUnusab
1dfc0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
1dfd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1dfe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1dff0 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  sCur.n==0 );.   
1e000 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d       if( sCur.n=
1e010 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e020 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
1e030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e040 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
1e050 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nce ){.         
1e060 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53   whereOrMove(&sS
1e070 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20  um, &sCur);.    
1e080 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
1e090 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e0a0 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72           WhereOr
1e0b0 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20  Set sPrev;.     
1e0c0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
1e0d0 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
1e0e0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
1e0f0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1e100 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
1e110 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
1e120 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1e130 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1e150 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
1e160 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
1e170 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
1e180 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1e1b0 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1e1c0 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
1e1d0 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
1e200 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
1e210 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
1e220 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
1e230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e240 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e250 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
1e260 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
1e270 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
1e280 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
1e290 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1e2a0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
1e2b0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
1e2c0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
1e2d0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1e2e0 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
1e2f0 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
1e300 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
1e310 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
1e320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1e330 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
1e340 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
1e350 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d  : Currently sSum
1e360 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65  .a[i].rRun is se
1e370 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20  t to the sum of 
1e380 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20  the costs.      
1e390 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d    ** of all sub-
1e3a0 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62  scans required b
1e3b0 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48  y the OR-scan. H
1e3c0 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72  owever, due to r
1e3d0 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20  ounding.        
1e3e0 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61  ** errors, it ma
1e3f0 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f  y be that the co
1e400 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61  st of the OR-sca
1e410 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74  n is equal to it
1e420 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73  s.        ** mos
1e430 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d  t expensive sub-
1e440 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d  scan. Add the sm
1e450 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
1e460 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20  penalty .       
1e470 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20   ** (equivalent 
1e480 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74  to multiplying t
1e490 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29  he cost by 1.07)
1e4a0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1e4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73  .        ** this
1e4c0 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
1e4d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  . Otherwise, for
1e4e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73   WHERE clauses s
1e4f0 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20  uch as the.     
1e500 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
1e510 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61  where there is a
1e520 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a  n index on "y":.
1e530 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1e540 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20     **     WHERE 
1e550 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20  likelihood(x=?, 
1e560 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20  0.99) OR y=?.   
1e570 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1e580 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d  ** the planner m
1e590 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22  ay elect to "OR"
1e5a0 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c   together a full
1e5b0 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20  -table scan and 
1e5c0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
1e5d0 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20  dex lookup. And 
1e5e0 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20  other similarly 
1e5f0 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f  odd results.  */
1e600 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1e610 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Run = sSum.a[i].
1e620 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20  rRun + 1;.      
1e630 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
1e640 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
1e650 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
1e660 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
1e670 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
1e680 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
1e690 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
1e6a0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
1e6b0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1e6c0 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63  x200, ("End proc
1e6d0 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
1e6e0 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
1e6f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e710 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
1e720 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
1e730 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74  ll tables .*/.st
1e740 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1e750 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f  opAddAll(WhereLo
1e760 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1e770 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
1e780 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1e790 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1e7a0 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20  Bitmask mPrereq 
1e7b0 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
1e7c0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
1e7d0 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
1e7e0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
1e7f0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
1e800 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e810 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1e820 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e830 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62  em *pEnd = &pTab
1e840 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  List->a[pWInfo->
1e850 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74  nLevel];.  sqlit
1e860 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
1e870 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
1e880 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e890 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1e8a0 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72  pNew;.  u8 prior
1e8b0 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20  Jointype = 0;.. 
1e8c0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
1e8d0 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1e8e0 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
1e8f0 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
1e900 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1e910 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
1e920 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
1e930 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
1e940 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
1e950 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c  em<pEnd; iTab++,
1e960 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42   pItem++){.    B
1e970 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1e980 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1e990 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
1e9a0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
1e9b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1e9c0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1e9d0 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
1e9e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
1e9f0 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  ( ((pItem->fg.jo
1ea00 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
1ea10 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  type) & (JT_LEFT
1ea20 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
1ea30 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1ea40 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
1ea50 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20  e when pItem is 
1ea60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ea70 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20  term on the.    
1ea80 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d    ** right-hand-
1ea90 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f  side of a LEFT o
1eaa0 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a  r CROSS JOIN.  *
1eab0 2f 0a 20 20 20 20 20 20 6d 50 72 65 72 65 71 20  /.      mPrereq 
1eac0 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  = mPrior;.    }.
1ead0 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70      priorJointyp
1eae0 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  e = pItem->fg.jo
1eaf0 69 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65 66 20  intype;.#ifndef 
1eb00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1eb10 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
1eb20 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
1eb30 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
1eb40 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1eb50 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66  item *p;.      f
1eb60 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20  or(p=&pItem[1]; 
1eb70 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
1eb80 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61        if( mUnusa
1eb90 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f  ble || (p->fg.jo
1eba0 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1ebb0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a  T|JT_CROSS)) ){.
1ebc0 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61            mUnusa
1ebd0 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  ble |= sqlite3Wh
1ebe0 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
1ebf0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d  fo->sMaskSet, p-
1ec00 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
1ec10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ec20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1ec30 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69  pAddVirtual(pBui
1ec40 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1ec50 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1ec60 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1ec70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1ec80 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b  ALTABLE */.    {
1ec90 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1eca0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
1ecb0 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 29  uilder, mPrereq)
1ecc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ecd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ece0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1ecf0 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c  eLoopAddOr(pBuil
1ed00 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  der, mPrereq, mU
1ed10 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a  nusable);.    }.
1ed20 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
1ed30 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
1ed40 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
1ed50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1ed60 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65  reak;.  }..  whe
1ed70 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
1ed80 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
1ed90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61  rc;.}../*.** Exa
1eda0 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68  mine a WherePath
1edb0 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74   (with the addit
1edc0 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61  ion of the extra
1edd0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68   WhereLoop of th
1ede0 65 20 36 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74  e 6th.** paramet
1edf0 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69  ers) to see if i
1ee00 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  t outputs rows i
1ee10 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1ee20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20  ORDER BY.** (or 
1ee30 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75  GROUP BY) withou
1ee40 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65  t requiring a se
1ee50 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72  parate sort oper
1ee60 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e  ation.  Return N
1ee70 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20  :.** .**   N>0: 
1ee80 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65    N terms of the
1ee90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1eea0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1eeb0 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65  *   N==0:  No te
1eec0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1eed0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73   BY clause are s
1eee0 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c  atisfied.**   N<
1eef0 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74  0:   Unknown yet
1ef00 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20   how many terms 
1ef10 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68  of ORDER BY migh
1ef20 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20  t be satisfied. 
1ef30 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68    .**.** Note th
1ef40 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  at processing fo
1ef50 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  r WHERE_GROUPBY 
1ef60 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e  and WHERE_DISTIN
1ef70 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a  CTBY is not as.*
1ef80 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20  * strict.  With 
1ef90 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1efa0 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72  TINCT the only r
1efb0 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68  equirement is th
1efc0 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  at.** equivalent
1efd0 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d   rows appear imm
1efe0 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e  ediately adjacen
1eff0 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  t to one another
1f000 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61  .  GROUP BY.** a
1f010 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e  nd DISTINCT do n
1f020 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20  ot require rows 
1f030 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79  to appear in any
1f040 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1f050 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  r as long.** as 
1f060 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20  equivalent rows 
1f070 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65  are grouped toge
1f080 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20  ther.  Thus for 
1f090 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53  GROUP BY and DIS
1f0a0 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72  TINCT.** the pOr
1f0b0 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20  derBy terms can 
1f0c0 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e  be matched in an
1f0d0 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f  y order.  With O
1f0e0 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a  RDER BY, the .**
1f0f0 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1f100 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20  must be matched 
1f110 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74  in strict left-t
1f120 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a  o-right order..*
1f130 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72  /.static i8 wher
1f140 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
1f150 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e  derBy(.  WhereIn
1f160 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f  fo *pWInfo,    /
1f170 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1f180 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1f190 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
1f1a0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
1f1b0 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43  UP BY or DISTINC
1f1c0 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63  T clause to chec
1f1d0 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  k */.  WherePath
1f1e0 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *pPath,     /* 
1f1f0 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f  The WherePath to
1f200 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20   check */.  u16 
1f210 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
1f220 20 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50    /* WHERE_GROUP
1f230 42 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42  BY or _DISTINCTB
1f240 59 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49  Y or _ORDERBY_LI
1f250 4d 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f  MIT */.  u16 nLo
1f260 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  op,            /
1f270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1f280 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c  ies in pPath->aL
1f290 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  oop[] */.  Where
1f2a0 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20  Loop *pLast,    
1f2b0 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65   /* Add this Whe
1f2c0 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e  reLoop to the en
1f2d0 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  d of pPath->aLoo
1f2e0 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  p[] */.  Bitmask
1f2f0 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f   *pRevMask     /
1f300 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57  * OUT: Mask of W
1f310 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e  hereLoops to run
1f320 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1f330 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76  r */.){.  u8 rev
1f340 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Set;            
1f350 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69  /* True if rev i
1f360 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20  s known */.  u8 
1f370 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
1f380 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20     /* Composite 
1f390 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
1f3a0 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20  u8 revIdx;      
1f3b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
1f3c0 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
1f3d0 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  8 isOrderDistinc
1f3e0 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f  t;   /* All prio
1f3f0 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65  r WhereLoops are
1f400 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
1f410 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74  */.  u8 distinct
1f420 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72  Columns;   /* Tr
1f430 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68  ue if the loop h
1f440 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55  as UNIQUE NOT NU
1f450 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
1f460 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20  u8 isMatch;     
1f470 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e        /* iColumn
1f480 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20   matches a term 
1f490 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1f4a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
1f4b0 65 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20  eqOpMask;       
1f4c0 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75    /* Allowed equ
1f4d0 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20  ality operators 
1f4e0 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c  */.  u16 nKeyCol
1f4f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
1f500 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75  mber of key colu
1f510 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f  mns in pIndex */
1f520 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20  .  u16 nColumn; 
1f530 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1f540 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65  l number of orde
1f550 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  red columns in t
1f560 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31  he index */.  u1
1f570 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  6 nOrderBy;     
1f580 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65      /* Number te
1f590 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1f5a0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1f5b0 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20  int iLoop;      
1f5c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1f5d0 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70  f WhereLoop in p
1f5e0 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65  Path being proce
1f5f0 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ssed */.  int i,
1f600 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1f610 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1f620 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
1f630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1f640 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1f650 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   current WhereLo
1f660 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  op */.  int iCol
1f670 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
1f680 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72   A column number
1f690 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43   within table iC
1f6a0 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ur */.  WhereLoo
1f6b0 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a  p *pLoop = 0; /*
1f6c0 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f   Current WhereLo
1f6d0 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  op being process
1f6e0 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ed. */.  WhereTe
1f6f0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f  rm *pTerm;     /
1f700 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
1f710 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1f720 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
1f730 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f  OBExpr;        /
1f740 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * An expression 
1f750 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
1f760 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f  Y clause */.  Co
1f770 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
1f780 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66      /* COLLATE f
1f790 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20  unction from an 
1f7a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1f7b0 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20  term */.  Index 
1f7c0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
1f7d0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73  /* The index ass
1f7e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f  ociated with pLo
1f7f0 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  op */.  sqlite3 
1f800 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1f810 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
1f820 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1f830 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  n */.  Bitmask o
1f840 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  bSat = 0;    /* 
1f850 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59  Mask of ORDER BY
1f860 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64   terms satisfied
1f870 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74   so far */.  Bit
1f880 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20  mask obDone;    
1f890 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
1f8a0 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
1f8b0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72   */.  Bitmask or
1f8c0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b  derDistinctMask;
1f8d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
1f8e0 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f   well-ordered lo
1f8f0 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ops */.  Bitmask
1f900 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20   ready;         
1f910 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1f920 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a  inner loops */..
1f930 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    /*.  ** We say
1f940 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
1f950 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69  s "one-row" if i
1f960 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d  t generates no m
1f970 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a  ore than one.  *
1f980 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
1f990 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73    A WhereLoop is
1f9a0 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20   one-row if all 
1f9b0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1f9c0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20   are true:.  ** 
1f9d0 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63   (a) All index c
1f9e0 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74  olumns match wit
1f9f0 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  h WHERE_COLUMN_E
1fa00 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65  Q..  **  (b) The
1fa10 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65   index is unique
1fa20 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c  .  ** Any WhereL
1fa30 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52  oop with an WHER
1fa40 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73  E_COLUMN_EQ cons
1fa50 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f  traint on the ro
1fa60 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a  wid is one-row..
1fa70 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72    ** Every one-r
1fa80 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c  ow WhereLoop wil
1fa90 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45  l have the WHERE
1faa0 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20  _ONEROW bit set 
1fab0 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a  in wsFlags..  **
1fac0 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
1fad0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
1fae0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69  rder-distinct" i
1faf0 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c  f the set of col
1fb00 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  umns from.  ** t
1fb10 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  hat WhereLoop th
1fb20 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52  at are in the OR
1fb30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1fb40 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  e different for 
1fb50 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  every.  ** row o
1fb60 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  f the WhereLoop.
1fb70 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20    Every one-row 
1fb80 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74  WhereLoop is aut
1fb90 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
1fba0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20  order-distinct. 
1fbb0 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68    A WhereLoop th
1fbc0 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  at has no column
1fbd0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1fbe0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73  Y clause.  ** is
1fbf0 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69   not order-disti
1fc00 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72  nct. To be order
1fc10 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74  -distinct is not
1fc20 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20   quite the same 
1fc30 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e  as being.  ** UN
1fc40 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49  IQUE since a UNI
1fc50 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e  QUE column or in
1fc60 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  dex can have mul
1fc70 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20  tiple rows that 
1fc80 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61  .  ** are NULL a
1fc90 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  nd NULL values a
1fca0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  re equivalent fo
1fcb0 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66  r the purpose of
1fcc0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
1fcd0 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65  .  ** To be orde
1fce0 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20  r-distinct, the 
1fcf0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
1fd00 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
1fd10 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ULL..  **.  ** T
1fd20 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74  he rowid for a t
1fd30 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55  able is always U
1fd40 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
1fd50 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74  LL so whenever t
1fd60 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70  he.  ** rowid ap
1fd70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44  pears in the ORD
1fd80 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
1fd90 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1fda0 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a  WhereLoop is.  *
1fdb0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1fdc0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
1fdd0 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
1fde0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
1fdf0 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70   if( nLoop && Op
1fe00 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1fe10 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72  ed(db, SQLITE_Or
1fe20 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20  derByIdxJoin) ) 
1fe30 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72  return 0;..  nOr
1fe40 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1fe50 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63  ->nExpr;.  testc
1fe60 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42  ase( nOrderBy==B
1fe70 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f  MS-1 );.  if( nO
1fe80 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72  rderBy>BMS-1 ) r
1fe90 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e  eturn 0;  /* Can
1fea0 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65  not optimize ove
1feb0 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20  rly large ORDER 
1fec0 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72  BYs */.  isOrder
1fed0 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
1fee0 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54  obDone = MASKBIT
1fef0 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20  (nOrderBy)-1;.  
1ff00 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1ff10 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d  k = 0;.  ready =
1ff20 20 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d   0;.  eqOpMask =
1ff30 20 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c   WO_EQ | WO_IS |
1ff40 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66   WO_ISNULL;.  if
1ff50 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
1ff60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
1ff70 49 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d  IT ) eqOpMask |=
1ff80 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c   WO_IN;.  for(iL
1ff90 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
1ffa0 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
1ffb0 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
1ffc0 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
1ffd0 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
1ffe0 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
1fff0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
20000 20 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f    if( iLoop<nLoo
20010 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  p ){.      pLoop
20020 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
20030 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66  iLoop];.      if
20040 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
20050 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
20060 49 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  IT ) continue;. 
20070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20080 70 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20  pLoop = pLast;. 
20090 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
200a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
200b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
200c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
200d0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  oop->u.vtab.isOr
200e0 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20  dered ) obSat = 
200f0 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72  obDone;.      br
20100 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
20110 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
20120 74 72 65 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30  tree.nIdxCol = 0
20130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72  ;.    }.    iCur
20140 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
20150 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
20160 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
20170 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
20180 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
20190 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
201a0 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
201b0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
201c0 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
201d0 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
201e0 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
201f0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
20200 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
20210 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
20220 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
20230 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
20240 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
20250 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
20260 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
20270 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
20280 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
20290 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
202a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
202b0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
202c0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
202d0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
202e0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
202f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20300 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
20310 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
20320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
20330 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
20340 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49  ereFindTerm(&pWI
20350 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
20360 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
20370 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20380 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
20390 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20   eqOpMask, 0);. 
203a0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
203b0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
203c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
203d0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
203e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  ){.        /* IN
203f0 20 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20   terms are only 
20400 76 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e  valid for sortin
20410 67 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  g in the ORDER B
20420 59 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20  Y LIMIT .       
20430 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
20440 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20  , and then only 
20450 69 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75  if they are actu
20460 61 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20  ally used.      
20470 20 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72    ** by the quer
20480 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20  y plan */.      
20490 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
204a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
204b0 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  ERBY_LIMIT );.  
204c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
204d0 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26  <pLoop->nLTerm &
204e0 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e  & pTerm!=pLoop->
204f0 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b  aLTerm[j]; j++){
20500 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
20510 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29  =pLoop->nLTerm )
20520 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20530 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
20540 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
20550 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20560 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
20570 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
20580 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
20590 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
205a0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
205b0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
205c0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
205d0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
205e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
205f0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
20600 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
20610 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
20620 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
20630 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
20640 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
20650 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
20660 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
20670 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
20680 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
20690 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
206a0 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
206b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
206c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
206d0 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
206e0 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ue;.        test
206f0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
20700 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
20710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
20720 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
20730 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
20740 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
20750 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
20760 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
20770 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
20780 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
20790 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
207a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
207b0 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
207c0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
207d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
207e0 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
207f0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
20800 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
20810 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
20820 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20840 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
20850 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
20860 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
20870 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
20880 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20890 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
208a0 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
208b0 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
208c0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
208d0 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
208e0 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
208f0 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20  =XN_ROWID.      
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20910 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
20920 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
20930 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
20940 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55  erDistinct = IsU
20950 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
20960 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
20970 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
20980 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
20990 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
209a0 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
209b0 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
209c0 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
209d0 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
209e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
209f0 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
20a00 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
20a10 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
20a20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
20a30 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
20a40 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 20 3d        u8 bOnce =
20a50 20 31 3b 20 2f 2a 20 54 72 75 65 20 74 6f 20 72   1; /* True to r
20a60 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
20a70 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
20a80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20a90 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  j>=pLoop->u.btre
20aa0 65 2e 6e 45 71 20 0a 20 20 20 20 20 20 20 20 20  e.nEq .         
20ab0 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c     || (pLoop->aL
20ac0 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c  Term[j]==0)==(j<
20ad0 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20  pLoop->nSkip).  
20ae0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
20af0 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
20b00 62 74 72 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d  btree.nEq && j>=
20b10 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a  pLoop->nSkip ){.
20b20 20 20 20 20 20 20 20 20 20 20 75 31 36 20 65 4f            u16 eO
20b30 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  p = pLoop->aLTer
20b40 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  m[j]->eOperator;
20b50 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ..          /* S
20b60 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20  kip over == and 
20b70 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65  IS and ISNULL te
20b80 72 6d 73 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70  rms.  (Also skip
20b90 20 49 4e 20 74 65 72 6d 73 20 77 68 65 6e 0a 20   IN terms when. 
20ba0 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e           ** doin
20bb0 67 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  g WHERE_ORDERBY_
20bc0 4c 49 4d 49 54 20 70 72 6f 63 65 73 73 69 6e 67  LIMIT processing
20bd0 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ). .          **
20be0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
20bf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
20c00 6d 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  m is a column of
20c10 20 61 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53   an ((?,?) IN (S
20c20 45 4c 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20  ELECT...)) .    
20c30 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
20c40 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74 68  ion for which th
20c50 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
20c60 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
20c70 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
20c80 20 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69   ** check that i
20c90 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f  t is the only co
20ca0 6c 75 6d 6e 20 75 73 65 64 20 62 79 20 74 68 69  lumn used by thi
20cb0 73 20 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73  s loop. Otherwis
20cc0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e,.          ** 
20cd0 69 66 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  if it is one of 
20ce0 74 77 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e  two or more, non
20cf0 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  e of the columns
20d00 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20   can be.        
20d10 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
20d20 74 6f 20 6d 61 74 63 68 20 61 6e 20 4f 52 44 45  to match an ORDE
20d30 52 20 42 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20  R BY term.  */. 
20d40 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
20d50 70 20 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30  p & eqOpMask)!=0
20d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20d70 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
20d80 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
20d90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
20da0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
20db0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20dc0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
20dd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
20de0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
20df0 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
20e00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
20e10 4c 57 41 59 53 28 65 4f 70 20 26 20 57 4f 5f 49  LWAYS(eOp & WO_I
20e20 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
20e30 20 20 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a 75    /* ALWAYS() ju
20e40 73 74 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70  stification: eOp
20e50 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20   is an equality 
20e60 6f 70 65 72 61 74 6f 72 20 64 75 65 20 74 6f 20  operator due to 
20e70 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
20e80 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ** j<pLoop->u.bt
20e90 72 65 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69  ree.nEq constrai
20ea0 6e 74 20 61 62 6f 76 65 2e 20 20 41 6e 79 20 65  nt above.  Any e
20eb0 71 75 61 6c 69 74 79 20 6f 74 68 65 72 0a 20 20  quality other.  
20ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
20ed0 6e 20 57 4f 5f 49 4e 20 69 73 20 63 61 70 74 75  n WO_IN is captu
20ee0 72 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  red by the previ
20ef0 6f 75 73 20 22 69 66 22 2e 20 20 53 6f 20 74 68  ous "if".  So th
20f00 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  is one.         
20f10 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 68 61 73     ** always has
20f20 20 74 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f   to be WO_IN. */
20f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
20f40 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61  r *pX = pLoop->a
20f50 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b  LTerm[j]->pExpr;
20f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
20f70 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d  (i=j+1; i<pLoop-
20f80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b  >u.btree.nEq; i+
20f90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
20fa0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54    if( pLoop->aLT
20fb0 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70  erm[i]->pExpr==p
20fc0 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  X ){.           
20fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
20fe0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  oop->aLTerm[i]->
20ff0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
21000 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  N) );.          
21010 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b        bOnce = 0;
21020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21030 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21060 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
21070 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20       /* Get the 
21080 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e  column number in
21090 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c   the table (iCol
210a0 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72  umn) and sort or
210b0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  der.        ** (
210c0 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20  revIdx) for the 
210d0 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  j-th column of t
210e0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
210f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
21100 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20   pIndex ){.     
21110 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
21120 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
21130 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  j];.          re
21140 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61  vIdx = pIndex->a
21150 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
21160 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
21170 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61  umn==pIndex->pTa
21180 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
21190 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
211a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
211b0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e      iColumn = XN
211c0 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20  _ROWID;.        
211d0 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
211e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
211f0 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
21200 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
21210 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
21220 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
21230 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
21240 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
21250 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
21260 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
21270 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
21280 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
21290 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
212a0 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
212b0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
212c0 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
212d0 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
212e0 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
212f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21300 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
21310 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
21320 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
21330 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
21340 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
21350 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
21360 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
21370 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
21380 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52  and mark that OR
21390 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20  DER BY term off 
213a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
213b0 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
213c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
213d0 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72  ; bOnce && i<nOr
213e0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
213f0 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
21400 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
21410 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21420 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
21430 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
21440 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
21450 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
21460 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21470 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21480 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
21490 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
214a0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
214b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
214c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
214d0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
214e0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
214f0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
21500 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
21510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21520 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a  Column>=(-1) ){.
21530 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21540 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
21550 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
21560 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
21570 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
21580 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
21590 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
215a0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
215b0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
215c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
215d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
215e0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
215f0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21600 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d 3e 61  OBExpr,pIndex->a
21610 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45  ColExpr->a[j].pE
21620 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20 20 20  xpr,iCur) ){.   
21630 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
21640 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
21650 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21660 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
21670 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
21680 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
21690 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
216a0 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
216b0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
216c0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
216d0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
216e0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
216f0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
21700 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21710 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
21720 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a  Name, pIndex->az
21730 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
21740 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21750 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 4c    }.          pL
21760 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64  oop->u.btree.nId
21770 78 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20 20  xCol = j+1;.    
21780 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
21790 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
217a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
217b0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
217c0 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
217d0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
217e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
217f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
21800 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
21810 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
21820 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
21830 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
21840 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
21850 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
21860 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
21870 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
21880 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
21890 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
218a0 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
218b0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
218c0 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
218d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
218e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
218f0 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
21900 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
21910 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
21920 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
21930 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
21940 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
21950 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
21960 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
21970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21980 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
21990 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
219a0 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44  Column==XN_ROWID
219b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
219c0 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e  testcase( distin
219d0 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a  ctColumns==0 );.
219e0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
219f0 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b  inctColumns = 1;
21a00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21a10 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
21a20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
21a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a40 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68       /* No match
21a50 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
21a60 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20      if( j==0 || 
21a70 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  j<nKeyCol ){.   
21a80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21a90 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
21aa0 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
21ab0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
21ac0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
21ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21ae0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
21af0 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
21b00 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
21b10 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
21b20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63       if( distinc
21b30 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20  tColumns ){.    
21b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
21b50 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30  OrderDistinct==0
21b60 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72   );.        isOr
21b70 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
21b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
21b90 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65  * end-if not one
21ba0 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  -row */..    /* 
21bb0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68  Mark off any oth
21bc0 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  er ORDER BY term
21bd0 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
21be0 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66   pLoop */.    if
21bf0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
21c00 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  t ){.      order
21c10 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20  DistinctMask |= 
21c20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
21c30 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21c40 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
21c50 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
21c60 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  p;.        Bitma
21c70 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20  sk mTerm;.      
21c80 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
21c90 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
21ca0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
21cb0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21cc0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d  pExpr;.        m
21cd0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
21ce0 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70 57  ereExprUsage(&pW
21cf0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70  Info->sMaskSet,p
21d00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
21d10 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69  Term==0 && !sqli
21d20 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21d30 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t(p) ) continue;
21d40 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54  .        if( (mT
21d50 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e  erm&~orderDistin
21d60 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
21d70 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
21d80 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
21d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21da0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
21db0 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
21dc0 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
21dd0 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
21de0 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
21df0 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
21e00 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
21e10 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20  (i8)nOrderBy;.  
21e20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74  if( !isOrderDist
21e30 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  inct ){.    for(
21e40 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e  i=nOrderBy-1; i>
21e50 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42  0; i--){.      B
21e60 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42  itmask m = MASKB
21e70 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20  IT(i) - 1;.     
21e80 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d   if( (obSat&m)==
21e90 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  m ) return i;.  
21ea0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
21eb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
21ec0 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  1;.}.../*.** If 
21ed0 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
21ee0 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
21ef0 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64   the mask passed
21f00 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
21f10 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20  Begin(),.** the 
21f20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20  planner assumes 
21f30 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69  that the specifi
21f40 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74  ed pOrderBy list
21f50 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47   is actually a G
21f60 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73  ROUP.** BY claus
21f70 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f  e - and so any o
21f80 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73  rder that groups
21f90 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65   rows as require
21fa0 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a  d satisfies the.
21fb0 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a  ** request..**.*
21fc0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74  * Normally, in t
21fd0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
21fe0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
21ff0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65  the caller to de
22000 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
22010 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f  er or not the ro
22020 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65  ws are really be
22030 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e  ing delivered in
22040 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f   sorted order, o
22050 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d  r.** just in som
22060 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68  e other order th
22070 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  at provides the 
22080 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e  required groupin
22090 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
220a0 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54  f the WHERE_SORT
220b0 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20  BYGROUP flag is 
220c0 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73  also passed to s
220d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
220e0 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  (), then.** this
220f0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
22100 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72   called on the r
22110 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
22120 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74  o object. It ret
22130 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20  urns.** true if 
22140 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20  the rows really 
22150 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69  will be sorted i
22160 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
22170 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a  order, or false.
22180 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ** otherwise..**
22190 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
221a0 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a   assuming:.**.**
221b0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
221c0 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a  i1 ON t1(x, Y);.
221d0 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a  **.** then.**.**
221e0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
221f0 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79   t1 GROUP BY x,y
22200 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20   ORDER BY x,y;  
22210 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
22220 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  1.**   SELECT * 
22230 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
22240 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c   y,x ORDER BY y,
22250 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  x;   -- IsSorted
22260 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ()==0.*/.int sql
22270 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65  ite3WhereIsSorte
22280 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
22290 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nfo){.  assert( 
222a0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
222b0 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
222c0 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  BY );.  assert( 
222d0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
222e0 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
222f0 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75  YGROUP );.  retu
22300 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65  rn pWInfo->sorte
22310 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  d;.}..#ifdef WHE
22320 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
22330 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
22340 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
22350 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
22360 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
22370 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
22380 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
22390 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
223a0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
223b0 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
223c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
223d0 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
223e0 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
223f0 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
22400 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
22410 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
22420 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
22430 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
22440 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
22450 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22460 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
22470 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d  nRow rows, assum
22480 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79  ing that the key
22490 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65  s have .** nOrde
224a0 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  rby columns and 
224b0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e  that the first n
224c0 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  Sorted columns a
224d0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a  re already in.**
224e0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
224f0 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f  c LogEst whereSo
22500 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65  rtingCost(.  Whe
22510 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a  reInfo *pWInfo,.
22520 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20    LogEst nRow,. 
22530 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20   int nOrderBy,. 
22540 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a   int nSorted.){.
22550 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74    /* TUNING: Est
22560 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61  imated cost of a
22570 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73   full external s
22580 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ort, where N is 
22590 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
225a0 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74   of rows to sort
225b0 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
225c0 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e   cost = (3.0 * N
225d0 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a   * log(N))..  **
225e0 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68   .  ** Or, if th
225f0 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73  e order-by claus
22600 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75  e has X terms bu
22610 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20  t only the last 
22620 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72  Y .  ** terms ar
22630 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20  e out of order, 
22640 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69  then block-sorti
22650 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74  ng will reduce t
22660 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67  he .  ** sorting
22670 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20   cost to:.  **. 
22680 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
22690 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20  0 * N * log(N)) 
226a0 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a  * (Y/X).  **.  *
226b0 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d  * The (Y/X) term
226c0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
226d0 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69  using stack vari
226e0 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a  able rScale.  **
226f0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f   below.  */.  Lo
22700 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f  gEst rScale, rSo
22710 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74  rtCost;.  assert
22720 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20  ( nOrderBy>0 && 
22730 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
22740 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61  t(100) );.  rSca
22750 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  le = sqlite3LogE
22760 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f  st((nOrderBy-nSo
22770 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72  rted)*100/nOrder
22780 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72  By) - 66;.  rSor
22790 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72  tCost = nRow + r
227a0 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f  Scale + 16;..  /
227b0 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f  * Multiple by lo
227c0 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73 20  g(M) where M is 
227d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
227e0 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20  tput rows..  ** 
227f0 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66 6f  Use the LIMIT fo
22800 72 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d 61  r M if it is sma
22810 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70  ller */.  if( (p
22820 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
22830 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  s & WHERE_USE_LI
22840 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e 66  MIT)!=0 && pWInf
22850 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29  o->iLimit<nRow )
22860 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57 49  {.    nRow = pWI
22870 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d  nfo->iLimit;.  }
22880 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20  .  rSortCost += 
22890 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
228a0 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74  return rSortCost
228b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
228c0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
228d0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61  reLoop objects a
228e0 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t pWInfo->pLoops
228f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
22900 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
22910 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
22920 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
22930 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
22940 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
22950 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
22960 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
22970 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
22980 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
22990 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  Assume that the 
229a0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
229b0 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74  output rows that
229c0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
229d0 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20   sorted.** will 
229e0 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74  be nRowEst (in t
229f0 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65  he 10*log2 repre
22a00 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c  sentation).  Or,
22a10 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a   ignore sorting.
22a20 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77  ** costs if nRow
22a30 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65  Est==0..**.** Re
22a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22a50 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c  n success or SQL
22a60 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d  ITE_NOMEM of a m
22a70 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
22a80 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
22a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22aa0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
22ab0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
22ac0 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73  o, LogEst nRowEs
22ad0 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69  t){.  int mxChoi
22ae0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
22af0 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
22b00 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
22b10 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
22b20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
22b50 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
22b60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22b80 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
22b90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
22ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22bb0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
22bc0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
22bd0 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
22be0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22bf0 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68   counter over th
22c00 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a  e terms of the j
22c10 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c  oin */.  int ii,
22c20 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20   jj;            
22c30 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22c40 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49  ers */.  int mxI
22c50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22c60 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
22c70 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70  ext entry to rep
22c80 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  lace */.  int nO
22c90 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
22ca0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22cb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22cc0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45   terms */.  LogE
22cd0 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
22ce0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
22cf0 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
22d00 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
22d10 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d  Est mxUnsorted =
22d20 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75   0;    /* Maximu
22d30 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20  m unsorted cost 
22d40 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
22d50 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
22d60 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
22d70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
22d80 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
22d90 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
22da0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
22db0 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
22dc0 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
22dd0 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
22de0 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
22df0 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
22e00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
22e10 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
22e20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
22e30 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
22e40 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
22e50 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
22e60 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
22e70 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
22e80 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
22e90 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
22ea0 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
22eb0 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
22ec0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
22ed0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
22ee0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
22ef0 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
22f00 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
22f10 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
22f20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
22f30 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
22f40 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
22f50 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53   */.  LogEst *aS
22f60 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20  ortCost = 0;    
22f70 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70  /* Sorting and p
22f80 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63  artial sorting c
22f90 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  osts */.  char *
22fa0 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
22fb0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
22fc0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
22fd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
22fe0 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20    int nSpace;   
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23000 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
23010 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63  located at pSpac
23020 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
23030 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
23040 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
23050 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
23060 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
23070 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
23080 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
23090 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
230a0 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
230b0 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
230c0 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
230d0 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
230e0 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
230f0 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
23100 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
23110 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
23120 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
23130 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20  nLoop<=1) ? 1 : 
23140 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
23150 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
23160 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
23170 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
23180 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
23190 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
231a0 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45   solver.  (nRowE
231b0 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45  st=%d)\n", nRowE
231c0 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  st));..  /* If n
231d0 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61  RowEst is zero a
231e0 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  nd there is an O
231f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
23200 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68  ignore it. In th
23210 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65  is.  ** case the
23220 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
23230 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69   call is to esti
23240 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
23250 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64  of rows returned
23260 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65  .  ** by the ove
23270 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65  rall query. Once
23280 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68   this estimate h
23290 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
232a0 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  , the caller.  *
232b0 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  * will invoke th
232c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65  is function a se
232d0 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69  cond time, passi
232e0 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  ng the estimate 
232f0 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77  as the.  ** nRow
23300 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20  Est parameter.  
23310 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
23320 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
23330 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  nRowEst==0 ){.  
23340 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
23350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72    }else{.    nOr
23360 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  derBy = pWInfo->
23370 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
23380 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
23390 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
233a0 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
233b0 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72  , aFrom and aSor
233c0 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70  tCost[] */.  nSp
233d0 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68  ace = (sizeof(Wh
233e0 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
233f0 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
23400 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
23410 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f   nSpace += sizeo
23420 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
23430 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d  erBy;.  pSpace =
23440 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
23450 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65  RawNN(db, nSpace
23460 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
23470 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
23480 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
23490 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
234a0 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
234b0 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
234c0 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
234d0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
234e0 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
234f0 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
23500 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
23510 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
23520 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
23530 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
23540 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
23550 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
23560 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69  op = pX;.  }.  i
23570 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
23580 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
23590 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
235a0 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e  ause and it is n
235b0 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  ot being ignored
235c0 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20  , set up.    ** 
235d0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53  space for the aS
235e0 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e  ortCost[] array.
235f0 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   Each element of
23600 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61   the aSortCost a
23610 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65  rray.    ** is e
23620 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61  ither zero - mea
23630 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20  ning it has not 
23640 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  yet been initial
23650 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20  ized - or the.  
23660 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72    ** cost of sor
23670 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77  ting nRowEst row
23680 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20  s of data where 
23690 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d  the first X term
236a0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
236b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
236c0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f  are already in o
236d0 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73  rder, where X is
236e0 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20   the array .    
236f0 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ** index.  */.  
23700 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c    aSortCost = (L
23710 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d  ogEst*)pX;.    m
23720 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c  emset(aSortCost,
23730 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   0, sizeof(LogEs
23740 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a  t) * nOrderBy);.
23750 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53    }.  assert( aS
23760 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70  ortCost==0 || &p
23770 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
23780 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74  char*)&aSortCost
23790 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20  [nOrderBy] );.  
237a0 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
237b0 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t!=0 || &pSpace[
237c0 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
237d0 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64  pX );..  /* Seed
237e0 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
237f0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
23800 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
23810 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
23820 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
23830 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
23840 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
23850 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
23860 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  8.  If the cost.
23870 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
23880 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
23890 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
238a0 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
238b0 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72   first 28.  ** r
238c0 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
238d0 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
238e0 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
238f0 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
23900 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
23910 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73  yLoop, 48);  ass
23920 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33  ert( 48==sqlite3
23930 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20  LogEst(28) );.  
23940 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73  nFrom = 1;.  ass
23950 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  ert( aFrom[0].is
23960 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20  Ordered==0 );.  
23970 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
23980 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20      /* If nLoop 
23990 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
239a0 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20  ere are no FROM 
239b0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65  terms in the que
239c0 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  ry. Since.    **
239d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   in this case th
239e0 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75  e query may retu
239f0 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  rn a maximum of 
23a00 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73  one row, the res
23a10 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ults.    ** are 
23a20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
23a30 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20  equested order. 
23a40 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  Set isOrdered to
23a50 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20   nOrderBy to.   
23a60 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69   ** indicate thi
23a70 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20  s. Or, if nLoop 
23a80 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
23a90 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65  zero, set isOrde
23aa0 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31  red to.    ** -1
23ab0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
23ac0 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
23ad0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
23ae0 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20  be ordered, .   
23af0 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   ** depending on
23b00 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64   the loops added
23b10 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
23b20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46  plan.  */.    aF
23b30 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
23b40 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20   = nLoop>0 ? -1 
23b50 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  : nOrderBy;.  }.
23b60 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75  .  /* Compute su
23b70 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65  ccessively longe
23b80 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69  r WherePaths usi
23b90 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
23ba0 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  generation.  ** 
23bb0 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73  of WherePaths as
23bc0 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74   the basis for t
23bd0 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74  he next.  Keep t
23be0 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68  rack of the mxCh
23bf0 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70  oice.  ** best p
23c00 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e  aths at each gen
23c10 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72  eration */.  for
23c20 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
23c30 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
23c40 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20  .    nTo = 0;.  
23c50 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f    for(ii=0, pFro
23c60 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f  m=aFrom; ii<nFro
23c70 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  m; ii++, pFrom++
23c80 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c  ){.      for(pWL
23c90 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
23ca0 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
23cb0 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74  op=pWLoop->pNext
23cc0 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c  Loop){.        L
23cd0 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64   /* Rows visited
23d00 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   by (pFrom+pWLoo
23d10 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
23d20 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20  /* Cost of path 
23d50 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
23d60 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
23d70 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20   rUnsorted;     
23d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
23d90 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
23da0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
23db0 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f  /.        i8 isO
23dc0 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
23dd0 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69  isOrdered;  /* i
23de0 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46  sOrdered for (pF
23df0 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
23e00 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
23e10 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20  askNew;         
23e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
23e30 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20   of src visited 
23e40 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20  by (..) */.     
23e50 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
23e60 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sk = 0;         
23e70 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
23e80 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20  rev-order loops 
23e90 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20  for (..) */..   
23ea0 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
23eb0 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
23ec0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
23ed0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23ee0 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
23ef0 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
23f00 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
23f10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23f20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
23f30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23f40 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
23f50 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31  && pFrom->nRow<1
23f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
23f70 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20  * Do not use an 
23f80 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
23f90 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f 70  if the this loop
23fa0 20 69 73 20 65 78 70 65 63 74 65 64 0a 20 20 20   is expected.   
23fb0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e         ** to run
23fc0 20 6c 65 73 73 20 74 68 61 6e 20 32 20 74 69 6d   less than 2 tim
23fd0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
23fe0 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
23ff0 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
24000 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
24010 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
24020 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
24030 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
24040 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
24050 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
24060 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
24070 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
24080 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73   */.        rUns
24090 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
240a0 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  ogEstAdd(pWLoop-
240b0 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
240c0 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
240d0 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e  ow);.        rUn
240e0 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
240f0 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
24100 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73  ted, pFrom->rUns
24110 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  orted);.        
24120 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  nOut = pFrom->nR
24130 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75  ow + pWLoop->nOu
24140 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  t;.        maskN
24150 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
24160 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
24170 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
24180 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30   if( isOrdered<0
24190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
241a0 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50  Ordered = whereP
241b0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
241c0 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
241f0 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
24200 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
24230 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b  Loop, &revMask);
24240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24250 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
24260 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
24270 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
24280 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
24290 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65  red>=0 && isOrde
242a0 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a  red<nOrderBy ){.
242b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53            if( aS
242c0 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
242d0 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d]==0 ){.       
242e0 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69       aSortCost[i
242f0 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72  sOrdered] = wher
24300 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
24320 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e  Info, nRowEst, n
24330 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72  OrderBy, isOrder
24340 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ed.            )
24350 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24360 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
24370 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
24380 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72  (rUnsorted, aSor
24390 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
243a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48  );..          WH
243b0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a  ERETRACE(0x002,.
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
243d0 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25  ---- sort cost=%
243e0 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72  -3d (%d/%d) incr
243f0 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74  eases cost %3d t
24400 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20  o %-3d\n",.     
24410 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
24420 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20  ost[isOrdered], 
24430 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65  (nOrderBy-isOrde
24440 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20  red), nOrderBy, 
24450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24460 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74  rUnsorted, rCost
24470 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ));.        }els
24480 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f  e{.          rCo
24490 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  st = rUnsorted;.
244a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
244b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
244c0 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f  ee if pWLoop sho
244d0 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20  uld be added to 
244e0 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20  the set of.     
244f0 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62     ** mxChoice b
24500 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
24510 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
24520 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f       ** First lo
24530 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ok for an existi
24540 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65  ng path among be
24550 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a  st-so-far paths.
24560 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
24570 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20  covers the same 
24580 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
24590 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73   has the same is
245a0 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
245b0 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68  ** setting as th
245c0 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63  e current path c
245d0 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20  andidate..      
245e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
245f0 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d  The term "((pTo-
24600 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
24610 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20  ered)&0x80)==0" 
24620 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
24630 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f        ** to (pTo
24640 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  ->isOrdered==(-1
24650 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d  ))==(isOrdered==
24660 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72  (-1))" for the r
24670 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ange.        ** 
24680 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20  of legal values 
24690 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d  for isOrdered, -
246a0 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a  1..64..        *
246b0 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
246c0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
246d0 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
246e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
246f0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
24700 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
24710 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f     && ((pTo->isO
24720 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
24730 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20  )&0x80)==0.     
24740 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
24750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a      testcase( jj
24760 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20  ==nTo-1 );.     
24770 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24790 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
247a0 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20  jj>=nTo ){.     
247b0 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20       /* None of 
247c0 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73  the existing bes
247d0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d  t-so-far paths m
247e0 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61  atch the candida
247f0 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
24800 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
24810 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ce.           &&
24820 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c   (rCost>mxCost |
24830 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  | (rCost==mxCost
24840 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d   && rUnsorted>=m
24850 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20  xUnsorted)).    
24860 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24870 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
24880 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73  ent candidate is
24890 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20   no better than 
248a0 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  any of the mxCho
248b0 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ice.            
248c0 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74  ** paths current
248d0 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73  ly in the best-s
248e0 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53  o-far buffer.  S
248f0 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20  o discard.      
24900 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
24910 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76  ndidate as not v
24920 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66  iable. */.#ifdef
24930 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24940 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
24950 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
24960 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
24970 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
24980 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24990 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20  gPrintf("Skip   
249a0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
249b0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
249c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
249d0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
249e0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
249f0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
24a00 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
24a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24a20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
24a30 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
24a40 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
24a50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
24a60 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
24a70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
24a80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
24a90 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
24aa0 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nts it means tha
24ab0 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64  t the new candid
24ac0 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20 20  ate path.       
24ad0 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62     ** needs to b
24ae0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
24af0 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61  et of best-so-fa
24b00 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20  r paths. */.    
24b10 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78        if( nTo<mx
24b20 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
24b30 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73        /* Increas
24b40 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
24b50 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65  e aTo set by one
24b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
24b70 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20  jj = nTo++;.    
24b80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
24ba0 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74 68  path replaces th
24bb0 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f  e prior worst to
24bc0 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f   keep count belo
24bd0 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20  w mxChoice */.  
24be0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d            jj = m
24bf0 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xI;.          }.
24c00 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20            pTo = 
24c10 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66  &aTo[jj];.#ifdef
24c20 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24c30 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
24c40 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
24c50 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
24c60 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
24c70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24c80 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63  ntf("New    %s c
24c90 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64  ost=%-3d,%3d,%3d
24ca0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
24cc0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
24cd0 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
24ce0 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20  ), rCost, nOut, 
24cf0 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20  rUnsorted,.     
24d00 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
24d10 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
24d20 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
24d30 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
24d40 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
24d50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
24d60 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68  ontrol reaches h
24d70 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66  ere if best-so-f
24d80 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b  ar path pTo=aTo[
24d90 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20  jj] covers the. 
24da0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65           ** same
24db0 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e   set of loops an
24dc0 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69  d has the same i
24dd0 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e 67  sOrdered setting
24de0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
24df0 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70    ** candidate p
24e00 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ath.  Check to s
24e10 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  ee if the candid
24e20 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61  ate should repla
24e30 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ce.          ** 
24e40 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61  pTo or if the ca
24e50 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62  ndidate should b
24e60 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  e skipped..     
24e70 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
24e80 20 20 20 2a 2a 20 54 68 65 20 63 6f 6e 64 69 74     ** The condit
24e90 69 6f 6e 61 6c 20 69 73 20 61 6e 20 65 78 70 61  ional is an expa
24ea0 6e 64 65 64 20 76 65 63 74 6f 72 20 63 6f 6d 70  nded vector comp
24eb0 61 72 69 73 6f 6e 20 65 71 75 69 76 61 6c 65 6e  arison equivalen
24ec0 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20 20 20  t to:.          
24ed0 2a 2a 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74  **   (pTo->rCost
24ee0 2c 70 54 6f 2d 3e 6e 52 6f 77 2c 70 54 6f 2d 3e  ,pTo->nRow,pTo->
24ef0 72 55 6e 73 6f 72 74 65 64 29 20 3c 3d 20 28 72  rUnsorted) <= (r
24f00 43 6f 73 74 2c 6e 4f 75 74 2c 72 55 6e 73 6f 72  Cost,nOut,rUnsor
24f10 74 65 64 29 0a 20 20 20 20 20 20 20 20 20 20 2a  ted).          *
24f20 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
24f30 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74  pTo->rCost<rCost
24f40 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
24f50 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f  (pTo->rCost==rCo
24f60 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
24f70 20 20 26 26 20 28 70 54 6f 2d 3e 6e 52 6f 77 3c    && (pTo->nRow<
24f80 6e 4f 75 74 0a 20 20 20 20 20 20 20 20 20 20 20  nOut.           
24f90 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d          || (pTo-
24fa0 3e 6e 52 6f 77 3d 3d 6e 4f 75 74 20 26 26 20 70  >nRow==nOut && p
24fb0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3c 3d 72  To->rUnsorted<=r
24fc0 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20 20 20  Unsorted).      
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20              ).  
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20              ).  
24ff0 20 20 20 20 20 20 20 20 29 7b 0a 23 69 66 64 65          ){.#ifde
25000 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25010 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
25020 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
25030 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
25040 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
25050 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25060 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
25070 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
25080 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
25090 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
250a0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
250b0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
250c0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
250d0 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
250e0 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65  , nOut, rUnsorte
250f0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
25100 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
25110 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
25120 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
25130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25140 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
25150 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
25160 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
25170 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
25180 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
25190 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
251a0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
251b0 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
251d0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70  To->rUnsorted, p
251e0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
251f0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
25200 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
25210 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
25220 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  if.            /
25230 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  * Discard the ca
25240 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72 6f  ndidate path fro
25250 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64  m further consid
25260 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
25270 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25280 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
25290 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
252a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
252b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
252c0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
252d0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
252e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
252f0 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20  Control reaches 
25300 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e 64  here if the cand
25310 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62 65  idate path is be
25320 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  tter than the.  
25330 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70          ** pTo p
25340 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54  ath.  Replace pT
25350 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64 69  o with the candi
25360 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20  date. */.#ifdef 
25370 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
25380 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
25390 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
253a0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
253b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
253c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
253d0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
253e0 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
253f0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64  ost=%-3d,%3d,%3d
25400 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
25410 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
25420 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
25430 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
25440 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
25450 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
25460 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
25470 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
25480 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
25490 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
254a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
254b0 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  was %s cost=%-3d
254c0 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
254d0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
254e0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
254f0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
25500 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
25510 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
25530 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f  ->rUnsorted, pTo
25540 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
25550 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
25560 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
25570 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25590 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
255a0 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
255b0 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
255c0 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
255d0 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
255e0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
255f0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
25600 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
25610 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
25620 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
25630 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
25640 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
25650 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
25660 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
25670 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
25680 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
25690 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
256a0 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
256b0 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
256c0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
256d0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
256e0 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
256f0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
25700 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
25710 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
25720 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
25730 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
25740 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
25750 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
25760 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
25770 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
25780 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
25790 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
257a0 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
257b0 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
257c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
257d0 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
257e0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
257f0 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
25800 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
25810 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
25820 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
25830 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
25840 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
25850 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
25860 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
25870 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
25880 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
25890 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
258a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
258b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
258c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
258d0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
258e0 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
258f0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
25900 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
25910 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
25920 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25930 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
25940 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
25950 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
25960 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
25970 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
25980 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
25990 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
259a0 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
259b0 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
259c0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
259d0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
259e0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
259f0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
25a00 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
25a10 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
25a20 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
25a30 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
25a40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
25a50 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
25a60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
25a70 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25a80 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
25a90 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
25aa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25ac0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
25ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25ae0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
25af0 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
25b00 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
25b10 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
25b20 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
25b30 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
25b40 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
25b50 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
25b60 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
25b70 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
25b80 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
25b90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
25ba0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
25bb0 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
25bc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
25bd0 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63  FreeNN(db, pSpac
25be0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
25bf0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
25c00 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
25c10 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
25c20 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
25c30 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
25c40 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
25c50 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
25c60 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
25c70 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
25c80 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
25c90 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
25ca0 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
25cb0 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
25cc0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
25cd0 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
25ce0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
25cf0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
25d00 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
25d10 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
25d20 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
25d30 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
25d40 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
25d50 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
25d60 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
25d70 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
25d80 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
25d90 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
25da0 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
25db0 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
25dc0 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
25dd0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
25de0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
25df0 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
25e00 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
25e10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
25e20 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
25e30 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
25e40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25e50 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
25e60 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
25e70 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
25e80 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
25e90 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
25ea0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
25eb0 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
25ec0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
25ed0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
25ee0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65  nfo, pWInfo->pRe
25ef0 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a  sultSet, pFrom,.
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
25f20 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  Y, nLoop-1, pFro
25f30 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
25f40 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ], &notUsed);.  
25f50 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f    if( rc==pWInfo
25f60 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45  ->pResultSet->nE
25f70 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49  xpr ){.      pWI
25f80 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
25f90 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
25fa0 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20  ORDERED;.    }. 
25fb0 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
25fc0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
25fd0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
25fe0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
25ff0 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
26000 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69      if( pFrom->i
26010 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f  sOrdered==pWInfo
26020 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
26030 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  r ){.        pWI
26040 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
26050 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
26060 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d  ORDERED;.      }
26070 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26080 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
26090 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
260a0 72 65 64 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  red;.      pWInf
260b0 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
260c0 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
260d0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
260e0 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20  OBSat<=0 ){.    
260f0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
26100 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  at = 0;.        
26110 69 66 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20  if( nLoop>0 ){. 
26120 20 20 20 20 20 20 20 20 20 75 33 32 20 77 73 46           u32 wsF
26130 6c 61 67 73 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  lags = pFrom->aL
26140 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73  oop[nLoop-1]->ws
26150 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  Flags;.         
26160 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20   if( (wsFlags & 
26170 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
26180 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
26190 28 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f  (wsFlags&(WHERE_
261a0 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  IPK|WHERE_COLUMN
261b0 5f 49 4e 29 29 21 3d 28 57 48 45 52 45 5f 49 50  _IN))!=(WHERE_IP
261c0 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  K|WHERE_COLUMN_I
261d0 4e 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  N).          ){.
261e0 20 20 20 20 20 20 20 20 20 20 20 20 42 69 74 6d              Bitm
261f0 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20  ask m = 0;.     
26200 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
26210 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
26220 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
26230 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  , pWInfo->pOrder
26240 42 79 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20  By, pFrom,.     
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26260 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c   WHERE_ORDERBY_L
26270 49 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  IMIT, nLoop-1, p
26280 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
26290 70 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20  p-1], &m);.     
262a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
262b0 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
262c0 5f 49 50 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  _IPK );.        
262d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
262e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
262f0 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20  LUMN_IN );.     
26300 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 70         if( rc==p
26310 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
26320 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
26330 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
26340 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
26350 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  p = 1;.         
26360 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
26370 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20 20  Mask = m;.      
26380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26390 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
263a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
263b0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
263c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
263d0 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20  SORTBYGROUP).   
263e0 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
263f0 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e  nOBSat==pWInfo->
26400 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
26410 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29  && nLoop>0.    )
26420 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
26430 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  revMask = 0;.   
26440 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20     int nOrder = 
26450 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
26460 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
26470 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  , pWInfo->pOrder
26480 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  By, .          p
26490 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31  From, 0, nLoop-1
264a0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
264b0 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73  Loop-1], &revMas
264c0 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  k.      );.     
264d0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
264e0 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20  >sorted==0 );.  
264f0 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d      if( nOrder==
26500 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
26510 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
26520 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65     pWInfo->sorte
26530 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
26540 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
26550 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
26560 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  }.    }.  }...  
26570 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
26580 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a  = pFrom->nRow;..
26590 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72    /* Free tempor
265a0 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ary memory and r
265b0 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f  eturn success */
265c0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
265d0 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  NN(db, pSpace);.
265e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
265f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
26600 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
26610 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
26620 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
26630 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
26640 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
26650 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
26660 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
26670 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
26680 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
26690 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
266a0 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
266b0 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
266c0 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
266d0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
266e0 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
266f0 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
26700 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
26710 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
26720 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
26730 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
26740 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
26750 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
26760 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
26770 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
26780 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
26790 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
267a0 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
267b0 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
267c0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
267d0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
267e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
267f0 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
26800 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
26810 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
26820 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
26830 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
26840 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
26850 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
26860 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
26870 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
26880 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
26890 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
268a0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
268b0 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e  x *pIdx;..  pWIn
268c0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
268d0 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49  WInfo;.  if( pWI
268e0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
268f0 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
26900 41 55 53 45 20 29 20 72 65 74 75 72 6e 20 30 3b  AUSE ) return 0;
26910 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
26920 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
26930 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20  c>=1 );.  pItem 
26940 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
26950 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20  st->a;.  pTab = 
26960 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69  pItem->pTab;.  i
26970 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
26980 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
26990 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
269a0 73 49 6e 64 65 78 65 64 42 79 20 29 20 72 65 74  sIndexedBy ) ret
269b0 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20  urn 0;.  iCur = 
269c0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
269d0 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d    pWC = &pWInfo-
269e0 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  >sWC;.  pLoop = 
269f0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
26a00 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
26a10 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e   = 0;.  pLoop->n
26a20 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72  Skip = 0;.  pTer
26a30 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
26a40 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
26a50 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
26a60 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66  |WO_IS, 0);.  if
26a70 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74  ( pTerm ){.    t
26a80 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
26a90 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
26aa0 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  S );.    pLoop->
26ab0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
26ac0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
26ad0 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  IPK|WHERE_ONEROW
26ae0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54  ;.    pLoop->aLT
26af0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
26b00 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
26b10 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70  m = 1;.    pLoop
26b20 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
26b30 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  1;.    /* TUNING
26b40 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69  : Cost of a rowi
26b50 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a  d lookup is 10 *
26b60 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75  /.    pLoop->rRu
26b70 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d  n = 33;  /* 33==
26b80 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
26b90 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) */.  }else{.  
26ba0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
26bb0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
26bc0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
26bd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61  {.      int opMa
26be0 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sk;.      assert
26bf0 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  ( pLoop->aLTermS
26c00 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  pace==pLoop->aLT
26c10 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  erm );.      if(
26c20 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
26c30 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20  pIdx).       || 
26c40 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
26c50 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c  ere!=0 .       |
26c60 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e  | pIdx->nKeyCol>
26c70 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d  ArraySize(pLoop-
26c80 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20  >aLTermSpace) . 
26c90 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b       ) continue;
26ca0 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  .      opMask = 
26cb0 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
26cc0 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  l ? (WO_EQ|WO_IS
26cd0 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20  ) : WO_EQ;.     
26ce0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
26cf0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
26d00 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
26d10 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
26d20 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
26d30 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70   j, 0, opMask, p
26d40 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
26d50 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
26d60 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ak;.        test
26d70 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
26d80 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
26d90 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
26da0 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65  >aLTerm[j] = pTe
26db0 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
26dc0 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e    if( j!=pIdx->n
26dd0 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
26de0 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  e;.      pLoop->
26df0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
26e00 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
26e10 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44  ONEROW|WHERE_IND
26e20 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  EXED;.      if( 
26e30 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  pIdx->isCovering
26e40 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55   || (pItem->colU
26e50 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
26e60 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20  Index(pIdx))==0 
26e70 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
26e80 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
26e90 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
26ea0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70     }.      pLoop
26eb0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20  ->nLTerm = j;.  
26ec0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
26ed0 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20  ee.nEq = j;.    
26ee0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
26ef0 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  .pIndex = pIdx;.
26f00 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
26f10 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75   Cost of a uniqu
26f20 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69  e index lookup i
26f30 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c  s 15 */.      pL
26f40 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20  oop->rRun = 39; 
26f50 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c   /* 39==sqlite3L
26f60 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  ogEst(15) */.   
26f70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26f80 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
26f90 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
26fa0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
26fb0 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49  ogEst)1;.    pWI
26fc0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
26fd0 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73   = pLoop;.    as
26fe0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d  sert( pWInfo->sM
26ff0 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69  askSet.n==1 && i
27000 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61  Cur==pWInfo->sMa
27010 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20  skSet.ix[0] );. 
27020 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
27030 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74  lf = 1; /* sqlit
27040 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26  e3WhereGetMask(&
27050 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
27060 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  , iCur); */.    
27070 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
27080 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
27090 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
270a0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
270b0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
270c0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
270d0 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  =  pWInfo->pOrde
270e0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
270f0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
27100 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
27110 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
27120 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
27130 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
27140 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
27150 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
27160 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
27170 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b  Loop->cId = '0';
27180 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
27190 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
271a0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
271b0 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
271c0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
271d0 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
271e0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
271f0 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
27200 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
27210 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
27220 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
27230 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
27240 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
27250 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
27260 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
27270 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
27280 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
27290 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
272a0 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
272b0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
272c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
272d0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
272e0 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
272f0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
27300 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
27310 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
27320 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
27330 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
27340 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
27350 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
27360 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
27370 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
27380 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
27390 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
273a0 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
273b0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
273c0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
273d0 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
273e0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
273f0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
27400 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
27410 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
27420 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
27430 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
27440 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
27450 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
27460 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
27470 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
27480 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
27490 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
274a0 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
274b0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
274c0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
274d0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
274e0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
274f0 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
27500 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
27510 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
27520 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
27530 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
27540 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
27550 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
27560 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
27570 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
27580 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
27590 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
275b0 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
275c0 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
275d0 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
275e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
275f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
27600 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
27610 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
27620 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
27630 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
27640 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
27650 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
27660 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
27670 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
27680 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
27690 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
276a0 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
276b0 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
276c0 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
276d0 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
276e0 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
276f0 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
27700 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
27710 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
27720 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
27730 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
27740 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
27750 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
27760 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
27770 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
27780 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
27790 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
277a0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
277b0 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
277c0 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
277d0 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
277e0 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
277f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
27800 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
27810 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
27820 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
27830 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
27840 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
27850 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
27860 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
27870 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
27880 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
27890 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
278a0 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
278b0 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
278c0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
278d0 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
278e0 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
278f0 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
27900 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
27910 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
27920 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
27930 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
27940 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
27950 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
27960 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
27970 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27980 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
27990 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
279a0 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
279b0 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
279c0 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
279d0 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
279e0 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
279f0 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
27a00 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
27a10 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
27a20 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
27a30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
27a40 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
27a50 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
27a60 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
27a70 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
27a80 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
27a90 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
27aa0 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
27ab0 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
27ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
27ad0 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
27ae0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
27af0 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
27b00 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
27b10 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
27b20 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
27b30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
27b40 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
27b50 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
27b60 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
27b70 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
27b80 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
27b90 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
27ba0 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
27bb0 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
27bc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
27bd0 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
27be0 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
27bf0 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
27c00 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
27c10 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
27c20 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
27c30 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
27c40 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
27c50 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
27c60 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
27c70 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
27c80 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
27c90 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
27ca0 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
27cb0 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
27cc0 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
27cd0 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
27ce0 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
27cf0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
27d00 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
27d10 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
27d20 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
27d30 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
27d40 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
27d50 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
27d60 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
27d70 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
27d80 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
27d90 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
27da0 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
27db0 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
27dc0 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
27dd0 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
27de0 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
27df0 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
27e00 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
27e10 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
27e20 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
27e30 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
27e40 59 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65  Y clause (or the
27e50 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
27e60 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45  .** if the WHERE
27e70 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
27e80 20 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61   set in wctrlFla
27e90 67 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20  gs) of a SELECT 
27ea0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20  statement.** if 
27eb0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
27ec0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
27ed0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
27ee0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
27ef0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
27f00 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
27f10 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
27f20 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
27f30 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
27f40 68 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d  he iIdxCur param
27f50 65 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73  eter is the curs
27f60 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
27f70 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57  index.  If .** W
27f80 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
27f90 45 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75  E is set, iIdxCu
27fa0 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
27fb0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64  number of an ind
27fc0 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  ex.** to use for
27fd0 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
27fe0 73 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52  ssing.  The WHER
27ff0 45 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  E clause should 
28000 75 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63  use this.** spec
28010 69 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66  ific cursor.  If
28020 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
28030 45 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74  ESIRED is set, t
28040 68 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a  hen iIdxCur is.*
28050 2a 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  * the first curs
28060 6f 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  or in an array o
28070 66 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c  f cursors for al
28080 6c 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78  l indices.  iIdx
28090 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  Cur should.** be
280a0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
280b0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
280c0 20 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e   cursor dependin
280d0 67 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78  g on which index
280e0 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a   is.** used..*/.
280f0 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
28100 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
28110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
28120 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28130 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
28140 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
28150 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52  List,      /* FR
28160 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73  OM clause: A lis
28170 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
28180 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
28190 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
281a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
281b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
281c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
281d0 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41  rderBy,     /* A
281e0 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  n ORDER BY (or G
281f0 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c  ROUP BY) clause,
28200 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
28210 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
28220 65 74 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 72  et,   /* Query r
28230 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65 71 27  esult set.  Req'
28240 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  d for DISTINCT *
28250 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
28260 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  gs,         /* T
28270 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
28280 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
28290 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
282a0 20 69 41 75 78 41 72 67 20 20 20 20 20 20 20 20   iAuxArg        
282b0 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45       /* If WHERE
282c0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73  _OR_SUBCLAUSE is
282d0 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
282e0 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f      ** If WHERE_
28310 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20  USE_LIMIT, then 
28320 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74  the limit amount
28330 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
28340 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
28350 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
28360 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
28370 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
28380 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
28390 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
283a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
283b0 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
283c0 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
283d0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
283e0 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
283f0 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
28400 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
28410 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
28420 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
28430 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
28440 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
28450 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
28460 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
28470 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
28480 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
28490 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
284a0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
284b0 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
284c0 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
284d0 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
284e0 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
284f0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
28500 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
28510 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
28520 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
28530 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
28540 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
28550 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
28560 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  Loop;          /
28570 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * Pointer to a s
28580 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  ingle WhereLoop 
28590 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
285a0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
285b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
285c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ounter */.  sqli
285d0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
285e0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
285f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
28600 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28620 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
28630 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20    u8 bFordelete 
28640 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
28650 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
28660 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70   or zero, as app
28670 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61  ropriate */..  a
28680 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
28690 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
286a0 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20  SS_MULTIROW)==0 
286b0 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77 63  || (.        (wc
286c0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
286d0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
286e0 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77  )!=0 .     && (w
286f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28700 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
28710 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  =0 .  ));..  /* 
28720 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52  Only one of WHER
28730 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f  E_OR_SUBCLAUSE o
28740 72 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  r WHERE_USE_LIMI
28750 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  T */.  assert( (
28760 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28770 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
28780 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
28790 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  || (wctrlFlags &
287a0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
287b0 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61  )==0 );..  /* Va
287c0 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a  riable initializ
287d0 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20  ation */.  db = 
287e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
287f0 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73  mset(&sWLB, 0, s
28800 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20  izeof(sWLB));.. 
28810 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f   /* An ORDER/GRO
28820 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  UP BY clause of 
28830 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72  more than 63 ter
28840 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74  ms cannot be opt
28850 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74  imized */.  test
28860 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26  case( pOrderBy &
28870 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
28880 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  r==BMS-1 );.  if
28890 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f  ( pOrderBy && pO
288a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42  rderBy->nExpr>=B
288b0 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20  MS ) pOrderBy = 
288c0 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72  0;.  sWLB.pOrder
288d0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
288e0 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65    /* Disable the
288f0 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69   DISTINCT optimi
28900 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  zation if SQLITE
28910 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20  _DistinctOpt is 
28920 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c  set via.  ** sql
28930 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53  ite3_test_ctrl(S
28940 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
28950 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e  PTIMIZATIONS,...
28960 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  ) */.  if( Optim
28970 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
28980 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69  db, SQLITE_Disti
28990 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77  nctOpt) ){.    w
289a0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48  ctrlFlags &= ~WH
289b0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
289c0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  T;.  }..  /* The
289d0 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
289e0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
289f0 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
28a00 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
28a10 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
28a20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
28a30 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69  testcase( pTabLi
28a40 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b  st->nSrc==BMS );
28a50 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
28a60 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
28a70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28a80 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
28a90 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
28aa0 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
28ab0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
28ac0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
28ad0 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e  ion normally gen
28ae0 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20  erates a nested 
28af0 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62  loop for all tab
28b00 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61  les in .  ** pTa
28b10 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74  bList.  But if t
28b20 68 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  he WHERE_OR_SUBC
28b30 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65  LAUSE flag is se
28b40 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
28b50 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
28b60 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
28b70 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
28b80 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
28b90 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
28ba0 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
28bb0 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
28bc0 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
28bd0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
28be0 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
28bf0 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
28c00 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28c10 53 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  SE) ? 1 : pTabLi
28c20 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
28c30 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
28c40 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
28c50 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
28c60 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
28c70 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
28c80 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
28c90 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
28ca0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
28cb0 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
28cc0 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
28cd0 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
28ce0 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
28cf0 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
28d00 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
28d10 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
28d20 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
28d30 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
28d40 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
28d50 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
28d60 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
28d70 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
28d80 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
28d90 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
28da0 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
28db0 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
28dc0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65  ow..  */.  nByte
28dd0 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
28de0 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
28df0 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
28e00 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
28e10 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
28e20 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
28e30 4e 4e 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  NN(db, nByteWInf
28e40 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
28e50 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
28e60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28e70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
28e80 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
28e90 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
28ea0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
28eb0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
28ec0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
28ed0 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
28ee0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
28ef0 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
28f00 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
28f10 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
28f20 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
28f30 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65  e;.  pWInfo->pRe
28f40 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c  sultSet = pResul
28f50 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
28f60 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
28f70 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f  = pWInfo->aiCurO
28f80 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a  nePass[1] = -1;.
28f90 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
28fa0 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
28fb0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
28fc0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
28fd0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
28fe0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
28ff0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
29000 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
29010 20 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74    pWInfo->iLimit
29020 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57   = iAuxArg;.  pW
29030 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
29040 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
29050 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65  nQueryLoop;.  me
29060 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f  mset(&pWInfo->nO
29070 42 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  BSat, 0, .      
29080 20 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72     offsetof(Wher
29090 65 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66  eInfo,sWC) - off
290a0 73 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c  setof(WhereInfo,
290b0 6e 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73  nOBSat));.  mems
290c0 65 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  et(&pWInfo->a[0]
290d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  , 0, sizeof(Wher
290e0 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a  eLoop)+nTabList*
290f0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
29100 6c 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l));.  assert( p
29110 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
29120 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20  =ONEPASS_OFF ); 
29130 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61   /* ONEPASS defa
29140 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20  ults to OFF */. 
29150 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
29160 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
29170 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
29180 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
29190 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
291a0 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
291b0 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
291c0 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
291d0 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
291e0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
291f0 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
29200 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
29210 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
29220 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
29230 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
29240 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
29250 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
29260 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
29270 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
29280 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
29290 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
292a0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
292b0 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
292c0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
292d0 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
292e0 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
292f0 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
29300 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
29310 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
29320 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
29330 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
29340 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
29350 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
29360 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
29370 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
29380 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
29390 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
293a0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
293b0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
293c0 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
293d0 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
293e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57   for(ii=0; ii<sW
293f0 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
29400 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54  i++){.    if( nT
29410 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
29420 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
29430 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70  ntNotJoin(sWLB.p
29440 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  WC->a[ii].pExpr)
29450 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29460 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
29470 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61  rse, sWLB.pWC->a
29480 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e  [ii].pExpr, pWIn
29490 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20  fo->iBreak,.    
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50       SQLITE_JUMP
294c0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
294d0 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77  WLB.pWC->a[ii].w
294e0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
294f0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
29500 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
29510 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
29520 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
29530 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
29540 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
29550 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
29560 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
29570 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
29580 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
29590 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
295a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
295b0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
295c0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
295d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
295e0 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
295f0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
29600 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
29610 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
29620 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74   **.  ** The N-t
29630 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  h term of the FR
29640 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73  OM clause is ass
29650 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20  igned a bitmask 
29660 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20  of 1<<N..  **.  
29670 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74  ** The rule of t
29680 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
29690 65 6e 63 65 20 65 6e 73 75 72 65 73 20 74 68 74  ence ensures tht
296a0 61 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  a if X is the bi
296b0 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61  tmask for.  ** a
296c0 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58   table T, then X
296d0 2d 31 20 69 73 20 74 68 65 20 62 69 74 6d 61 73  -1 is the bitmas
296e0 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20  k for all other 
296f0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
29700 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e  ft of T..  ** Kn
29710 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
29720 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
29730 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
29740 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20  a left join is. 
29750 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   ** important.  
29760 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
29770 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
29780 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
29790 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
297a0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
297b0 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
297c0 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
297d0 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
297e0 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
297f0 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
29800 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
29810 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
29820 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
29830 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
29840 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53  .  ** WHERE_OR_S
29850 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73  UBCLAUSE flag is
29860 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   set..  */.  for
29870 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
29880 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
29890 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
298a0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
298b0 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
298c0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  r);.    sqlite3W
298d0 68 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28  hereTabFuncArgs(
298e0 70 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73  pParse, &pTabLis
298f0 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66  t->a[ii], &pWInf
29900 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66  o->sWC);.  }.#if
29910 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
29920 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
29930 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
29940 69 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61  ii++){.    Bitma
29950 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  sk m = sqlite3Wh
29960 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b  ereGetMask(pMask
29970 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
29980 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
29990 20 20 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41     assert( m==MA
299a0 53 4b 42 49 54 28 69 69 29 20 29 3b 0a 20 20 7d  SKBIT(ii) );.  }
299b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
299c0 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
299d0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
299e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
299f0 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54  reExprAnalyze(pT
29a00 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
29a10 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d  >sWC);.  if( db-
29a20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29a30 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
29a40 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63 74  rror;..  if( wct
29a50 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29a60 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
29a70 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
29a80 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
29a90 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
29aa0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65  pWInfo->sWC, pRe
29ab0 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20  sultSet) ){.    
29ac0 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
29ad0 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
29ae0 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
29af0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
29b00 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
29b10 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
29b20 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
29b30 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
29b40 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
29b50 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
29b60 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
29b70 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
29b80 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
29b90 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
29ba0 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
29bb0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
29bc0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
29bd0 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c  OrderBy = pResul
29be0 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
29bf0 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
29c00 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
29c10 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66  jects */.#if def
29c20 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
29c30 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73  ENABLED).  if( s
29c40 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
29c50 20 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20   & 0xffff ){.   
29c60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
29c70 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ntf("*** Optimiz
29c80 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63  er Start *** (wc
29c90 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c  trlFlags: 0x%x",
29ca0 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
29cb0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
29cc0 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
29cd0 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
29ce0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
29cf0 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75   limit: %d", iAu
29d00 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xArg);.    }.   
29d10 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
29d20 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a  ntf(")\n");.  }.
29d30 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29d40 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
29d50 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c  ){ /* Display al
29d60 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
29d70 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
29d80 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
29d90 6c 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e  lausePrint(sWLB.
29da0 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
29db0 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ..  if( nTabList
29dc0 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
29dd0 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
29de0 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
29df0 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
29e00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
29e10 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
29e20 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20  rror;.  .#ifdef 
29e30 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
29e40 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
29e50 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20  e3WhereTrace ){ 
29e60 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c     /* Display al
29e70 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
29e80 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
29e90 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
29ea0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
29eb0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
29ec0 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  t char zLabel[] 
29ed0 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
29ee0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
29ef0 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f20 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
29f30 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
29f40 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
29f50 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
29f60 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
29f70 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
29f80 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
29f90 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
29fa0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
29fb0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
29fc0 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
29fd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
29fe0 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
29ff0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
2a000 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
2a010 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2a020 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2a030 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
2a040 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
2a050 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
2a060 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
2a070 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
2a080 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
2a090 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2a0a0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2a0b0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
2a0c0 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
2a0d0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
2a0e0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
2a0f0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
2a100 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
2a110 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
2a120 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69  ALLBITS;.  }.  i
2a130 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2a140 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
2a150 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
2a160 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2a170 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
2a180 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
2a190 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2a1a0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
2a1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2a1c0 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
2a1d0 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
2a1e0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2a1f0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
2a200 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  o->nOBSat>0 ){. 
2a210 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2a220 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
2a230 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57  Y=%d,0x%llx", pW
2a240 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57  Info->nOBSat, pW
2a250 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
2a260 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
2a270 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
2a280 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
2a290 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2a2a0 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
2a2b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2a2c0 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
2a2d0 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
2a2e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a2f0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
2a300 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
2a310 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
2a320 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2a330 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
2a340 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
2a350 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a360 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
2a370 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2a380 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
2a390 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2a3a0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
2a3b0 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
2a3c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a3d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2a3e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2a3f0 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
2a400 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
2a410 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
2a420 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
2a430 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
2a440 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70  ].pWLoop, sWLB.p
2a450 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  WC);.    }.  }.#
2a460 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d  endif.  /* Attem
2a470 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
2a480 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
2a490 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65  that do not effe
2a4a0 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  ct the result */
2a4b0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
2a4c0 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
2a4d0 52 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20  ResultSet!=0.   
2a4e0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2a4f0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2a500 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a  E_OmitNoopJoin).
2a510 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
2a520 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74   tabUsed = sqlit
2a530 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55  e3WhereExprListU
2a540 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2a550 52 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20  ResultSet);.    
2a560 69 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  if( sWLB.pOrderB
2a570 79 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73  y ){.      tabUs
2a580 65 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  ed |= sqlite3Whe
2a590 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
2a5a0 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70  pMaskSet, sWLB.p
2a5b0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a  OrderBy);.    }.
2a5c0 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
2a5d0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a  o->nLevel>=2 ){.
2a5e0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2a5f0 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20  *pTerm, *pEnd;. 
2a600 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49       pLoop = pWI
2a610 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  nfo->a[pWInfo->n
2a620 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b  Level-1].pWLoop;
2a630 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e  .      if( (pWIn
2a640 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2a650 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e  pLoop->iTab].fg.
2a660 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
2a670 46 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  FT)==0 ) break;.
2a680 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c        if( (wctrl
2a690 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
2a6a0 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a  NT_DISTINCT)==0.
2a6b0 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2a6c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2a6d0 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20  E_ONEROW)==0.   
2a6e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72     ){.        br
2a6f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2a700 20 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20     if( (tabUsed 
2a710 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
2a720 66 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  f)!=0 ) break;. 
2a730 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42       pEnd = sWLB
2a740 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70  .pWC->a + sWLB.p
2a750 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20  WC->nTerm;.     
2a760 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e   for(pTerm=sWLB.
2a770 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45  pWC->a; pTerm<pE
2a780 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
2a790 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2a7a0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
2a7b0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
2a7c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  0.         && !E
2a7d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a7e0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
2a7f0 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20  FromJoin).      
2a800 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62    ){.          b
2a810 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2a820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a830 28 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62  ( pTerm<pEnd ) b
2a840 72 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52  reak;.      WHER
2a850 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28  ETRACE(0xffff, (
2a860 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63  "-> drop loop %c
2a870 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c   not used\n", pL
2a880 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20  oop->cId));.    
2a890 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
2a8a0 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69  --;.      nTabLi
2a8b0 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st--;.    }.  }.
2a8c0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
2a8d0 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  fff,("*** Optimi
2a8e0 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
2a8f0 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  \n"));.  pWInfo-
2a900 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  >pParse->nQueryL
2a910 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e  oop += pWInfo->n
2a920 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66  RowOut;..  /* If
2a930 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
2a940 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2a950 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
2a960 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
2a970 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
2a980 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
2a990 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
2a9a0 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
2a9b0 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
2a9c0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
2a9d0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2a9e0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
2a9f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
2aa00 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
2aa10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2aa20 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
2aa30 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c   ){.    int wsFl
2aa40 61 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  ags = pWInfo->a[
2aa50 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
2aa60 67 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65  gs;.    int bOne
2aa70 72 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26  row = (wsFlags &
2aa80 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d   WHERE_ONEROW)!=
2aa90 30 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72  0;.    if( bOner
2aaa0 6f 77 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74  ow.     || ((wct
2aab0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2aac0 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2aad0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
2aae0 26 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26  && 0==(wsFlags &
2aaf0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2ab00 42 4c 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  BLE)).    ){.   
2ab10 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50     pWInfo->eOneP
2ab20 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20  ass = bOnerow ? 
2ab30 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a  ONEPASS_SINGLE :
2ab40 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a   ONEPASS_MULTI;.
2ab50 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
2ab60 69 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  id(pTabList->a[0
2ab70 5d 2e 70 54 61 62 29 20 26 26 20 28 77 73 46 6c  ].pTab) && (wsFl
2ab80 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2ab90 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20  ONLY) ){.       
2aba0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
2abb0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2abc0 4d 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20  MULTIROW ){.    
2abd0 20 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65        bFordelete
2abe0 20 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c   = OPFLAG_FORDEL
2abf0 45 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ETE;.        }. 
2ac00 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
2ac10 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
2ac20 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26  ags = (wsFlags &
2ac30 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
2ac40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ac50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2ac60 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
2ac70 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
2ac80 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
2ac90 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
2aca0 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
2acb0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
2acc0 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  ii=0, pLevel=pWI
2acd0 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c  nfo->a; ii<nTabL
2ace0 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65  ist; ii++, pLeve
2acf0 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
2ad00 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
2ad10 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
2ad20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
2ad30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2ad40 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2ad50 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
2ad60 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  */.    struct Sr
2ad70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
2ad80 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49  Item;..    pTabI
2ad90 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2ada0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2adb0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
2adc0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
2add0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2ade0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2adf0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2ae00 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2ae10 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
2ae20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2ae30 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2ae40 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
2ae50 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2ae60 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
2ae70 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66  */.    }else.#if
2ae80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ae90 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2aea0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2aeb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2aec0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
2aed0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2aee0 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
2aef0 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
2af00 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
2af10 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
2af20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
2af30 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
2af40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2af50 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
2af60 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
2af70 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
2af80 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
2af90 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
2afa0 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20     /* noop */.  
2afb0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2afc0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2afd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2afe0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
2aff0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
2b000 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
2b010 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a  UBCLAUSE)==0 ){.
2b020 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
2b030 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
2b040 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f    if( pWInfo->eO
2b050 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
2b060 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  OFF ){.        o
2b070 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  p = OP_OpenWrite
2b080 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2b090 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
2b0a0 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ] = pTabItem->iC
2b0b0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a  ursor;.      };.
2b0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
2b0d0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
2b0e0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2b0f0 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
2b100 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b110 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2b120 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  r==pLevel->iTabC
2b130 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
2b140 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  case( pWInfo->eO
2b150 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2b160 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
2b170 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
2b180 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
2b190 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
2b1a0 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
2b1b0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
2b1c0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2b1d0 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2b1e0 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2b1f0 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73  >nCol<BMS && Has
2b200 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
2b210 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
2b220 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
2b230 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
2b240 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
2b250 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
2b260 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
2b270 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2b280 67 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49  geP4(v, -1, SQLI
2b290 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
2b2a0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
2b2b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
2b2c0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
2b2d0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2b2e0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
2b2f0 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66  R_HINTS.      if
2b300 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
2b310 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
2b320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b330 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2b340 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64  LAG_SEEKEQ|bFord
2b350 65 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65  elete);.      }e
2b360 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2b370 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2b380 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2b390 2c 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20  , bFordelete);. 
2b3a0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2b3b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2b3c0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
2b3d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b3e0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43  dOp4Dup8(v, OP_C
2b3f0 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62  olumnsUsed, pTab
2b400 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
2b410 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61   (const u8*)&pTa
2b440 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20  bItem->colUsed, 
2b450 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
2b460 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2b470 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
2b480 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
2b490 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
2b4a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2b4b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
2b4c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2b4d0 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
2b4e0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
2b4f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2b500 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
2b510 74 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  t iIndexCur;.   
2b520 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
2b530 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f  penRead;.      /
2b540 2a 20 69 41 75 78 41 72 67 20 69 73 20 61 6c 77  * iAuxArg is alw
2b550 61 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20  ays set if to a 
2b560 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
2b570 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73  f ONEPASS is pos
2b580 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  sible */.      a
2b590 73 73 65 72 74 28 20 69 41 75 78 41 72 67 21 3d  ssert( iAuxArg!=
2b5a0 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63  0 || (pWInfo->wc
2b5b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2b5c0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2b5d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
2b5e0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2b5f0 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65  ) && IsPrimaryKe
2b600 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20  yIndex(pIx).    
2b610 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
2b620 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2b630 43 4c 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20  CLAUSE)!=0.     
2b640 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2b650 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20  his is one term 
2b660 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a  of an OR-optimiz
2b670 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20  ation using the 
2b680 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61  PRIMARY KEY of a
2b690 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48  .        ** WITH
2b6a0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
2b6b0 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20    No need for a 
2b6c0 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a  separate index *
2b6d0 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  /.        iIndex
2b6e0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
2b6f0 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f  abCur;.        o
2b700 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
2b710 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65  se if( pWInfo->e
2b720 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
2b730 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20  _OFF ){.        
2b740 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62  Index *pJ = pTab
2b750 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  Item->pTab->pInd
2b760 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  ex;.        iInd
2b770 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b  exCur = iAuxArg;
2b780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b790 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2b7a0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2b7b0 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77  RED );.        w
2b7c0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29  hile( ALWAYS(pJ)
2b7d0 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20   && pJ!=pIx ){. 
2b7e0 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43           iIndexC
2b7f0 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ur++;.          
2b800 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a  pJ = pJ->pNext;.
2b810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b820 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
2b830 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
2b840 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
2b850 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72  s[1] = iIndexCur
2b860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2b870 28 20 69 41 75 78 41 72 67 20 26 26 20 28 77 63  ( iAuxArg && (wc
2b880 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2b890 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d  _OR_SUBCLAUSE)!=
2b8a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  0 ){.        iIn
2b8b0 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67  dexCur = iAuxArg
2b8c0 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  ;.        op = O
2b8d0 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20  P_ReopenIdx;.   
2b8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b8f0 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
2b900 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2b910 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
2b920 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
2b930 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
2b940 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
2b950 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
2b960 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
2b970 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
2b980 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
2b990 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2b9a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2b9b0 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20   op, iIndexCur, 
2b9c0 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  pIx->tnum, iDb);
2b9d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b9e0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
2b9f0 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
2ba00 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f         if( (pLoo
2ba10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2ba20 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
2ba30 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
2ba40 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2ba50 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
2ba60 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43  NGE|WHERE_SKIPSC
2ba70 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  AN))==0.        
2ba80 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2ba90 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
2baa0 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20  DERBY_MIN)==0.  
2bab0 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f         && pWInfo
2bac0 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d 57 48 45  ->eDistinct!=WHE
2bad0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2bae0 52 45 44 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  RED.        ){. 
2baf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bb00 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2bb10 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20  OPFLAG_SEEKEQ); 
2bb20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42  /* Hint to COMDB
2bb30 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  2 */.        }. 
2bb40 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2bb50 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
2bb60 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65  ->zName));.#ifde
2bb70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2bb80 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2bb90 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2bba0 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64       u64 colUsed
2bbb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2bbc0 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20  int ii, jj;.    
2bbd0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
2bbe0 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ii<pIx->nColumn;
2bbf0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2bc00 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69      jj = pIx->ai
2bc10 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20  Column[ii];.    
2bc20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30          if( jj<0
2bc30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bc40 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e           if( jj>
2bc50 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20  63 ) jj = 63;.  
2bc60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2bc70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
2bc80 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d   & MASKBIT(jj))=
2bc90 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2bca0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
2bcb0 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c  ed |= ((u64)1)<<
2bcc0 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33  (ii<63 ? ii : 63
2bcd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2bce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bcf0 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
2bd00 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
2bd10 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20  , iIndexCur, 0, 
2bd20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd40 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64     (u8*)&colUsed
2bd50 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
2bd60 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
2bd70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2bd80 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20  OLUMN_USED_MASK 
2bd90 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2bda0 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20  .    if( iDb>=0 
2bdb0 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
2bdc0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
2bdd0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
2bde0 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
2bdf0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2be00 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
2be10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2be20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2be30 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
2be40 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2be50 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
2be60 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
2be70 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
2be80 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
2be90 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
2bea0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
2beb0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
2bec0 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
2bed0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2bee0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
2bef0 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
2bf00 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  st; ii++){.    i
2bf10 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a  nt addrExplain;.
2bf20 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
2bf30 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
2bf40 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
2bf50 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76    wsFlags = pLev
2bf60 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
2bf70 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ags;.#ifndef SQL
2bf80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
2bf90 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
2bfa0 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
2bfb0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2bfc0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
2bfd0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
2bfe0 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
2bff0 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
2c000 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
2c010 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
2c020 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2c030 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
2c040 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
2c050 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2c060 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2c070 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
2c080 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
2c090 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
2c0a0 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
2c0b0 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50  Scan(.        pP
2c0c0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2c0d0 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
2c0e0 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
2c0f0 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20  Flags.    );.   
2c100 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
2c110 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  y = sqlite3VdbeC
2c120 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2c130 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71     notReady = sq
2c140 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e  lite3WhereCodeOn
2c150 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
2c160 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
2c170 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
2c180 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
2c190 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20  ->addrCont;.    
2c1a0 69 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45  if( (wsFlags&WHE
2c1b0 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
2c1c0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  && (wctrlFlags&W
2c1d0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2c1e0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)==0 ){.      s
2c1f0 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63  qlite3WhereAddSc
2c200 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61 62  anStatus(v, pTab
2c210 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64  List, pLevel, ad
2c220 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  drExplain);.    
2c230 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65  }.  }..  /* Done
2c240 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c  . */.  VdbeModul
2c250 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  eComment((v, "Be
2c260 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29  gin WHERE-core")
2c270 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
2c280 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
2c290 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
2c2a0 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
2c2b0 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57  nError:.  if( pW
2c2c0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72  Info ){.    pPar
2c2d0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
2c2e0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
2c2f0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  ueryLoop;.    wh
2c300 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
2c310 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pWInfo);.  }.  r
2c320 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2c330 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
2c340 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2c350 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
2c360 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
2c370 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
2c380 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2c390 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
2c3a0 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
2c3b0 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
2c3c0 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
2c3d0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2c3e0 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
2c3f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2c400 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
2c410 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2c420 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
2c430 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
2c440 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
2c450 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2c460 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2c470 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
2c480 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
2c490 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
2c4a0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  .  */.  VdbeModu
2c4b0 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
2c4c0 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  nd WHERE-core"))
2c4d0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2c4e0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2c4f0 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
2c500 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
2c510 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
2c520 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65   addr;.    pLeve
2c530 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2c540 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  ];.    pLoop = p
2c550 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
2c560 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
2c570 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69  p!=OP_Noop ){.#i
2c580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
2c590 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2c5a0 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e  ISTINCT.      in
2c5b0 74 20 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a  t addrSeek = 0;.
2c5c0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
2c5d0 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  x;.      int n;.
2c5e0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2c5f0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
2c600 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2c610 52 45 44 0a 20 20 20 20 20 20 20 26 26 20 28 70  RED.       && (p
2c620 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c630 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2c640 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 49 64  0.       && (pId
2c650 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
2c660 65 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73 53  ee.pIndex)->hasS
2c670 74 61 74 31 0a 20 20 20 20 20 20 20 26 26 20 28  tat1.       && (
2c680 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  n = pLoop->u.btr
2c690 65 65 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20  ee.nIdxCol)>0.  
2c6a0 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 61 69       && pIdx->ai
2c6b0 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36  RowLogEst[n]>=36
2c6c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2c6d0 20 20 69 6e 74 20 72 31 20 3d 20 70 50 61 72 73    int r1 = pPars
2c6e0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
2c6f0 20 20 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20     int j, op;.  
2c700 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2c710 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; j++){.      
2c720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c730 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
2c740 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  mn, pLevel->iIdx
2c750 43 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20  Cur, j, r1+j);. 
2c760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c770 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2c780 20 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f 70   n+1;.        op
2c790 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f   = pLevel->op==O
2c7a0 50 5f 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b  P_Prev ? OP_Seek
2c7b0 4c 54 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a  LT : OP_SeekGT;.
2c7c0 20 20 20 20 20 20 20 20 61 64 64 72 53 65 65 6b          addrSeek
2c7d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2c7e0 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70  dOp4Int(v, op, p
2c7f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
2c800 30 2c 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20  0, r1, n);.     
2c810 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2c820 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
2c830 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  LT);.        Vdb
2c840 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
2c850 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20  p==OP_SeekGT);. 
2c860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c870 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2c880 6f 74 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 1, pLevel->
2c890 70 32 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  p2);.      }.#en
2c8a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49  dif /* SQLITE_DI
2c8b0 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f  SABLE_SKIPAHEAD_
2c8c0 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20  DISTINCT */.    
2c8d0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
2c8e0 63 61 73 65 3a 20 41 64 76 61 6e 63 65 20 74 6f  case: Advance to
2c8f0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f   the next row */
2c900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c910 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2c920 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
2c930 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
2c940 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2c950 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
2c960 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2c970 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b  p2, pLevel->p3);
2c980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c990 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c  beChangeP5(v, pL
2c9a0 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20  evel->p5);.     
2c9b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2c9c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2c9d0 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2c9e0 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a  ->op==OP_Next);.
2c9f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2ca00 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2ca10 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20  op==OP_Prev);.  
2ca20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2ca30 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2ca40 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66  ==OP_VNext);.#if
2ca50 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2ca60 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49  BLE_SKIPAHEAD_DI
2ca70 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 66 28  STINCT.      if(
2ca80 20 61 64 64 72 53 65 65 6b 20 29 20 73 71 6c 69   addrSeek ) sqli
2ca90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2caa0 76 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a 23 65  v, addrSeek);.#e
2cab0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
2cac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2cad0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2cae0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2caf0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
2cb00 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2cb10 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
2cb20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
2cb30 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
2cb40 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
2cb50 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
2cb60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2cb70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2cb80 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
2cb90 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
2cba0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
2cbb0 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
2cbc0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
2cbd0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
2cbe0 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
2cbf0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2cc00 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
2cc10 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  p+1);.        if
2cc20 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  ( pIn->eEndLoopO
2cc30 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
2cc40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2cc50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
2cc60 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
2cc70 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
2cc80 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
2cc90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2cca0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  (v);.          V
2ccb0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2ccc0 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2ccd0 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29  ==OP_PrevIfOpen)
2cce0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2ccf0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
2cd00 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
2cd10 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20  P_NextIfOpen);. 
2cd20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cd30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2cd40 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
2cd50 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
2cd60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2cd70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2cd80 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
2cd90 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
2cda0 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
2cdb0 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
2cdc0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70  te3VdbeGoto(v, p
2cdd0 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
2cde0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2cdf0 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b  ent((v, "next sk
2ce00 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
2ce10 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2ce20 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
2ce30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ce40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
2ce50 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
2ce60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ce70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
2ce80 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29  vel->addrSkip-2)
2ce90 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
2cea0 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53  SQLITE_LIKE_DOES
2ceb0 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20  NT_MATCH_BLOBS. 
2cec0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
2ced0 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20  ddrLikeRep ){.  
2cee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cef0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
2cf00 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28  JumpZero, (int)(
2cf10 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
2cf20 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20  Cntr>>1),.      
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf40 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69    pLevel->addrLi
2cf50 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64  keRep);.      Vd
2cf60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2cf70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2cf80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
2cf90 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
2cfa0 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
2cfb0 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 61 64  sFlags;.      ad
2cfc0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2cfd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
2cfe0 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
2cff0 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65  tJoin); VdbeCove
2d000 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61  rage(v);.      a
2d010 73 73 65 72 74 28 20 28 77 73 20 26 20 57 48 45  ssert( (ws & WHE
2d020 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
2d030 7c 7c 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  || (ws & WHERE_I
2d040 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
2d050 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
2d060 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2d070 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2d080 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2d090 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
2d0a0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
2d0b0 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
2d0c0 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
2d0d0 45 52 45 5f 49 4e 44 45 58 45 44 29 20 0a 20 20  ERE_INDEXED) .  
2d0e0 20 20 20 20 20 7c 7c 20 28 28 77 73 20 26 20 57       || ((ws & W
2d0f0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26  HERE_MULTI_OR) &
2d100 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  & pLevel->u.pCov
2d110 69 64 78 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  idx) .      ){. 
2d120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d130 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2d140 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2d150 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
2d160 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
2d170 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
2d180 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
2d190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d1a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
2d1b0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2d1c0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2d1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d1e0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
2d1f0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2d200 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
2d210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d220 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2d230 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
2d240 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
2d250 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c  (v, "End WHERE-l
2d260 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20  oop%d: %s", i,. 
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d280 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62      pWInfo->pTab
2d290 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2d2a0 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61  iFrom].pTab->zNa
2d2b0 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  me));.  }..  /* 
2d2c0 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
2d2d0 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
2d2e0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2d2f0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
2d300 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
2d310 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
2d320 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2d330 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
2d340 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
2d350 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c  o->nLevel<=pTabL
2d360 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
2d370 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
2d380 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
2d390 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
2d3a0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2d3b0 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20  int k, last;.   
2d3c0 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
2d3d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2d3e0 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  0;.    struct Sr
2d3f0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
2d400 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2d410 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2d420 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
2d430 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2d440 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2d450 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2d460 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
2d470 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a  >pWLoop;..    /*
2d480 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e   For a co-routin
2d490 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50  e, change all OP
2d4a0 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63  _Column referenc
2d4b0 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  es to the table 
2d4c0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
2d4d0 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50  -routine into OP
2d4e0 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20  _Copy of result 
2d4f0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72  contained in a r
2d500 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20  egister..    ** 
2d510 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73  OP_Rowid becomes
2d520 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f   OP_Null..    */
2d530 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65  .    if( pTabIte
2d540 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2d550 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ne ){.      test
2d560 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62  case( pParse->db
2d570 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2d580 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74  ;.      translat
2d590 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50  eColumnToCopy(pP
2d5a0 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  arse, pLevel->ad
2d5b0 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e  drBody, pLevel->
2d5c0 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5e0 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72       pTabItem->r
2d5f0 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20  egResult, 0);.  
2d600 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2d610 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2d620 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
2d630 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42   index, make VDB
2d640 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  E code substitut
2d650 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
2d660 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
2d670 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  e index instead 
2d680 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  of from the tabl
2d690 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  e where possible
2d6a0 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  .  In some cases
2d6b0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  .    ** this opt
2d6c0 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e  imization preven
2d6d0 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ts the table fro
2d6e0 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61  m ever being rea
2d6f0 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20  d, which can.   
2d700 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e   ** yield a sign
2d710 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61  ificant performa
2d720 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a  nce boost..    *
2d730 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
2d740 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
2d750 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
2d760 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2d770 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
2d780 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
2d790 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
2d7a0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
2d7b0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
2d7c0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
2d7d0 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
2d7e0 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
2d7f0 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
2d800 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
2d810 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
2d820 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
2d830 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
2d840 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
2d850 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
2d860 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
2d870 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2d880 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
2d890 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  D|WHERE_IDX_ONLY
2d8a0 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  ) ){.      pIdx 
2d8b0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2d8c0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  .pIndex;.    }el
2d8d0 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
2d8e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
2d8f0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
2d900 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
2d910 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
2d920 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20      if( pIdx.   
2d930 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f    && (pWInfo->eO
2d940 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2d950 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  OFF || !HasRowid
2d960 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a  (pIdx->pTable)).
2d970 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c       && !db->mal
2d980 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b  locFailed.    ){
2d990 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
2d9a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2d9b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b  Addr(v);.      k
2d9c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
2d9d0 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  ody;.      pOp =
2d9e0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
2d9f0 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
2da00 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
2da10 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
2da20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
2da30 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
2da40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2da50 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
2da60 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
2da70 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78  .          int x
2da80 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2da90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2daa0 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62  dx->pTable==pTab
2dab0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2dac0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2dad0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2dae0 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
2daf0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2db00 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2db10 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
2db20 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20  >aiColumn[x];.  
2db30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2db40 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
2db50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2db60 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
2db70 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78  nOfIndex(pIdx, x
2db80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2db90 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   x>=0 ){.       
2dba0 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78       pOp->p2 = x
2dbb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  ;.            pO
2dbc0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2dbd0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2dbe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
2dbf0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
2dc00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2dc10 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78  DX_ONLY)==0 || x
2dc20 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
2dc30 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f     || pWInfo->eO
2dc40 6e 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20  nePass );.      
2dc50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
2dc60 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
2dc70 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
2dc80 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
2dc90 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2dca0 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2dcb0 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
2dcc0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2dcd0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2dce0 5f 49 66 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  _IfNullRow ){.  
2dcf0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
2dd00 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
2dd10 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
2dd20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2dd30 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
2dd40 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
2dd50 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2dd60 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2dd70 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
2dd80 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
2dd90 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
2dda0 0a                                               .